#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
Результаты идентичны.