【问题标题】:Ruby on Rails link_to :method => :delete syntaxRuby on Rails link_to :method => :delete 语法
【发布时间】:2011-08-31 05:24:35
【问题描述】:

这是一个小问题。我有一个资源Project,其中has_manyFeeds。当我在项目页面上查看嵌套提要列表时,我有一个 Delete 按钮可以从项目中删除该提要。它使用以下语法:

<%= link_to 'Delete', [feed.project, feed], :confirm => 'Are you sure?', :method => :delete %>

但这会指向列出所有提要的页面,我希望它重定向回用户刚才所在的项目页面。是更改[feed.project, feed] 还是其他问题?我还不太了解link_to 的语法。

编辑: 在我的 feeds_controller.rb 中,我将重定向行更改为 :back

def destroy
project = Project.find(params[:project_id])
@feed = project.feeds.find(params[:id])
@feed.destroy
redirect_to :back

respond_to do |format|
  format.html { redirect_to :back }
  format.xml  { head :ok }
end
end

【问题讨论】:

    标签: ruby-on-rails ruby link-to


    【解决方案1】:

    您必须查看此资源的控制器。它应该是app/controllers/projects_controller 之类的地方,那里应该有一个名为destroy 的操作。执行重定向的代码必须在其中。您必须更改以下行:

    redirect_to project_feeds_url(project)
    

    到这里

    redirect_to :back
    

    【讨论】:

    • 要销毁的资源是Feed对象,所以我去feeds_controller.rb,在destroy方法中加入redirect。这错误到:Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action.
    • @Paul:该错误意味着您可能假设redirect_to(和/或render)退出控制器操作...实际上,您需要执行以下操作: redirect_to :back and return(之后立即从该方法返回)。
    • @Paul:您不应该添加 redirect_to :back 行,它必须替换操作代码中已经存在的redirect_to ...
    • @Nicolas,哦,我现在明白了。我对直接在其中添加该行的其他评论感到困惑。请参阅上面的编辑了解我的工作内容。
    【解决方案2】:

    在你的控制器中

    def destroy
      @project = Project.find(params[:project_id])
      @feed = @project.feeds.find(params[:id])
      @feed.destroy
      redirect_to @project
    end
    

    【讨论】:

    • 这样做会给我一个Cannot redirect to nil! 错误。这在我的 feeds_controller 中正确吗?当我单击删除按钮时,我正在查看的页面类似于http://localhost:3000/projects/1。因为它是一个提要对象,它仍然是提要控制器吗?
    猜你喜欢
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多