如何正确删除?

时间:2010-12-06 19:47:51

标签: ruby-on-rails routes action destroy

有些东西严重没有在这里添加..我的页面只是刷新,没有任何反应,它永远不会触及我的所有方法上的任何调试器,除了索引。

我的HTML

<%- for image in @images %>
  <%= image.attachment_file_name %>

  <%-# link_to_delete image, :url => destroy_image_admin_wysiwyg_path(image.id) %>
  <%= link_to 'delete', { :url => destroy_image_image_path(image.id) },
        #:confirm => 'Are you sure?',
        :post => true
     %>

  <br />
<% end %>

我的控制器

def destroy_image
  debugger
  @img = Image.find(params[:id])
  @img.destroy
  respond_to do |format|
    format.html { redirect_to admin_image_rotator_path }
  end
end

我的路线:

map.resources :images, :member => { :destroy_image => :post }

我发现更好的东西后,我的恶心黑客会被取代

我把动作移到了我自己构建的更简单的控制器上。

将我的路线更改为:

admin.resources :wysiwygs, :member => { :destroy_image => :post }

更改了我的HTML:

<%= link_to 'delete', :controller => "wysiwygs", :action => "destroy_image" %>

但是当我点击链接时..提起...... show动作? fffffffffuuuuuuu

我只是将我的动作移动到show动作,并在我的HTML中传递一个隐藏的字段进行报复..

<%= link_to 'delete', :controller => "wysiwygs", :action => "destroy_image", :hidden_field => {:value =>  image.id} %>

  def show
    # this was previously in destroy_image
    @img = Image.find(params[:hidden_field][:value])
    @img.destroy
    respond_to do |format|
      format.html { redirect_to admin_image_rotator_path }
    end
  end

3 个答案:

答案 0 :(得分:3)

这似乎你走错了路。如果before_filter阻止了您的操作,会找出原因。如果不需要过滤器,请使用skip_before_filter :filter_name

请勿使用show操作或HTTP GET进行删除操作。即使它有效,它也会使事情变得混乱。使用DELETE动词:

map.resources :images, :member => { :destroy_image => :delete }

在链接帮助器中传递它:

<%= link_to "delete", destroy_image_image_path(image), :method => :delete %>

使用ImagesController#destroy_image执行操作。更好的是,请考虑使用ImagesController#destroy免费提供的标准RESTful map.resources

答案 1 :(得分:1)

首先不确定出了什么问题,但在第二个有效的解决方案中,我认为你应该按照以下方式编写link_to

link_to 'delete', :controller => "wysiwygs", :action => "destroy_image", :id => image.id    

至少会发送给你正确的行动。 根据您的路线,您必须将其设为method => :post或不是rake routes。 检查您的_path输出,它会显示可能的路线,以及他们获得的名称,然后您可以将其用作方法(在{}添加_urllink_to 'delete', wysiwygs_destroy_image_path(image) 结束)。那么写起来应该更容易:

{{1}}
祝你好运!

答案 2 :(得分:0)

你正在进行POST,但是你的资源说:destroy_image只能通过GET获得。尝试将路线更改为:

map.resources :images, :member => { :destroy_image => :post }

另外,请查看您的link_to。第二个参数采用URL,而不是具有:url键的哈希。如其他地方所述,根据您的Rails版本,您可能需要:method => :post而不是:post => true。在Rails 2.3.8中,您需要这一行:

<%= link_to 'delete', destroy_image_image_path(image), :method => :post %>