Использование частей в Rails 6 для разделения файлов

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

У меня есть photo_upload.html.erb файл, в котором я перечисляю все свои файлы.

 <div id="photos"><%= render partial: "rooms/photos", locals: { photos: @room.images } %></div>
  

Обратите внимание, что я передал photos в locals.

Затем я создал новый файл _photos.html.erb и поместил код ff:

 <% if @photos.count > 0 %>
<br/><br/>

<div class="row">
<% @photos.each do |photo| %>
   <div class="col-md-4">
     <%= render partial: 'rooms/photo', locals: { photo: photo } %>
  </div>
<% end %>
</div>
<% end %>
  

А затем добавил еще одну часть для каждой отдельной фотографии, создав новый файл _photo.html.erb , куда я помещаю коды ff:

  <%= image_tag(photo,  class: "test_image") %>
  <%= link_to "Remove", delete_image_attachment_rooms_path(photo), class: 'delete', remote: true, method: :delete, data: { confirm: "Are you sure you want to delete this?" } %>
  

Обратите внимание, что все файлы находятся в одной папке rooms . Однако это не позволяет прочитать photo или photos , хотя я уже передал их локальным пользователям.

Вот мой контроллер для вашей справки:

 class RoomsController < ApplicationController
  before_action :set_room, except: [:index, :new, :create, :delete_image_attachment]
  before_action :authenticate_user!, except: [:show]

  def index
    @rooms = currrent_user.rooms
  end

  def new
    @room = current_user.rooms.create
  end

  def create
    @room = current_user.rooms.create(room_params)

    if @room.save
      redirect_to listing_room_path(@room), notice: "Saved..."
    else 
      flash[:alert] = "Something went wrong!"
      render :new
    end 
  end

  def show
  end 

  def listing
  end

  def pricing
  end

  def description
  end

  def photo_upload
  end

  def amenities
  end

  def location
  end

  def update
    if @room.update(room_params)
      @room.images.attach(params[:room][:room_images])
      
      flash[:notice] = "Saved..."
    else 
      flash[:alert] = "Something went wrong..."
    end 
    redirect_back(fallback_location: request.referrer)
  end

  def delete_image_attachment
    @image = ActiveStorage::Attachment.find_by(params[:id])
    @imageamp;.purge
    # flash[:notice] = "Image deleted..."
    # redirect_back(fallback_location: request.referrer)
    respond_to do |format|
      format.js 
    end
  end

  private


  def set_room
    @room = Room.find(params[:id])
  end 

  def room_params
    params.require(:room).permit(:home_type, :room_type, :accomodate, :bed_room, :bath_room, :listing_name, :summary, :address, :is_tv, :is_kitchen, :is_air, :is_heating, :is_internet, :price, :active, images: [])
  end 
end
  

Мне интересно, что я здесь делаю не так, чтобы разделить частичные элементы и все еще могу заставить это работать. Я делаю что-то не так с локальными данными и частичным именованием?

Пожалуйста, помогите!

Ответ №1:

Когда вы передаете локальную переменную в частичную, у нее нет @ префикса. @photos это не то, как вы используете локальную доставку locals: { photos: ... } , вам нужно photos .

Именно то, как вы используете photo в своем _photos partial, а не @photo .

Обратите также внимание, что вы используете устаревший синтаксис. Вы можете заменить их…

 render partial: "rooms/photos", locals: { photos: @room.images }
render partial: 'rooms/photo', locals: { photo: photo }
  

с помощью этих:

 render 'rooms/photos', photos: @room.images
render 'rooms/photo', photo: photo
  

Результаты идентичны.