传递嵌套资源的id以删除rails中的文件

时间:2015-12-17 13:08:40

标签: jquery ruby-on-rails ruby

我有一张包含许多照片的商家信息。所以我使用的是嵌套资源。但现在面临的问题是我无法删除任何一张照片。我可以看到它,因为照片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进行硬编码,则可以轻松删除它。有人能告诉我这里有什么问题吗?

2 个答案:

答案 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_idid - 这是照片ID)

所以,在你的destroy方法的链接中,你需要做的就是包括这个:

<%= link_to listing_photo_path(listing_id: @listing.id, id: photo.id), remote: true, method: :delete, data: {confirm: "Are you sure?"} do %>