我有一张包含许多照片的商家信息。所以我使用的是嵌套资源。但现在面临的问题是我无法删除任何一张照片。我可以看到它,因为照片ID是零。
这是我的photos_controller
class PhotosController < ApplicationController
before_action :set_listing
def index
@photos = @listing.photos.all
end
def create
@photo = @listing.photos.new(photo_params)
if @photo.save
respond_to do |format|
format.js
end
end
end
def destroy
@photo = @listing.photos.find(params[:id])
@photo.destroy
redirect_to photos_url, notice: 'Photo was successfully destroyed.'
end
private
def set_listing
@listing = Listing.find(params[:listing_id])
end
def photo_params
params.require(:photo).permit(:image, :remove_image)
end
end
的routes.rb
resources :listings do
resources :photos, only: [:index, :create, :destroy]
end
在我的索引页面中,我有一个div来显示部分图像 index.html.erb
create.html.erb
$("#photos div").append("<%= j render(@photo) %>")
这是我的照片部分
_photo.html.erb
<div class="col-md-4">
<div class="panel panel-default">
<div class="panel-heading-preview">
<%= image_tag photo.image_url(:thumb) %>
</div>
<div class="panel-body">
<span class="pull-right">
<%= link_to "#", remote: true, method: :delete, data: {confirm: "Are you sure?"} do %>
<i class="fa fa-times fa-lg"></i>
<% end %>
</span>
</div>
</div>
</div>
在_photo.html.erb中我也试过
<%= link_to listing_photo_path(photo.id), remote: true, method: :delete, data: {confirm: "Are you sure?"} do %>
但是在加载索引页面时出现此错误
没有路线匹配{:action =&gt;&#34; destroy&#34;,:controller =&gt;&#34; photos&#34;,:id =&gt; nil, :listing_id =&gt; 1}缺少必需的键:[:id]
所有照片都有ID,如果我对照片的ID进行硬编码,则可以轻松删除它。有人能告诉我这里有什么问题吗?
答案 0 :(得分:1)
您还应该提供Listing
ID,因为您拥有嵌套资源:
<%= link_to listing_photo_path(@listing, photo) # etc. %>
或简单地说:
<%= link_to [@listing, photo] # etc %>
答案 1 :(得分:1)
当您在路线中拥有嵌套资源时,您将拥有以下两级identifying ids
:
resources :listings do
resources :photos, only: [:index, :create, :destroy]
end
嵌套照片的典型网址(如果您选中rake routes
)将如下所示:
/listings/:listing_id/photos/:id
这意味着您需要提供最多两个标识符(listing_id
和id
- 这是照片ID)
所以,在你的destroy方法的链接中,你需要做的就是包括这个:
<%= link_to listing_photo_path(listing_id: @listing.id, id: photo.id), remote: true, method: :delete, data: {confirm: "Are you sure?"} do %>