link_to自定义操作但错误的方法?

时间:2013-03-26 16:32:38

标签: ruby-on-rails ruby-on-rails-3.2

所有,我正在尝试使用put方法进行自定义操作:在

中 _post.html.erb中的

我有一个link_to语句:

<%= link_to 'End now', post, :method => :put, :action => endnow %>

routes.rb包含:

  resources :posts do
    member do
      put :endnow
    end

和posts_controller.rb看起来像:

class PostsController < ApplicationController
  helper_method :endnow

  [.. code for create, edit, destroy, etc ..]

  def endnow
    puts params
  end

end

rake routes的相关行看起来像: endnow_post PUT /posts/:id/endnow(.:format)帖子#endnow

但是,单击此链接时,操作endnow帮助程序不会运行。 奇怪的是,它确实运行了索引操作(我可以从puts命令中判断出来)。 当然,最终endnow的代码会更新@post,但是现在它只是运行不正常。

也许我正在以错误的方式解决这个问题 - 我想要实现的是在点击指向该帖子的链接时更新@post,然后再显示它。

任何想法/替代品?

1 个答案:

答案 0 :(得分:7)

为什么不使用提供给您的路线助手方法?将您的链接更改为

<%= link_to 'End now', endnow_post_path(@post), method: :put %>

你做错了什么:

  1. 如果要指定:action,请使用符号作为操作(您缺少冒号)。 :action => endnow应为action: :endnow
  2. 我假设您有一个@post实例变量,您正在从控制器传递给您的操作。你应该使用它而不是post(除非你确实有一个你从代码中省略的本地post变量)
  3. 您正在使用endnow作为动作;您应该删除控制器中的helper_method :endnow行,因为它不是您希望/应该从您的视图中访问的内容。
  4. 这可以通过使用路由助手来避免(对于endnow_post你要追加_path来获取本地路径路径:endnow_post_path),并传入{{1}作为一个参数。

    由于您尝试执行@post请求,因此必须确保资产管道中包含jquery-ujs之类的内容,以便将这些链接转换为幕后提交内容;浏览器不会通过单击链接来支持PUT


    至于为什么在PUT工作时出现模板错误,Rails告诉您需要创建link_to文件。您的操作只有app/views/posts/endnow.html.erb,不会终止执行,让Rails假设您仍在尝试渲染一些puts params模板。


    是否有其他方法可以执行您要执行的操作(更改特定模型的单个属性)?当然。是否有更好方式?那是非常主观的;它可能不是最RESTful的方式,但它可以说更容易处理(例如,在更新您在endnow.html.erb中修改的属性之前,需要检查非常具体的授权规则。您是否开始采用fleshing方式出去工作?绝对。

    最后,作为正确方向的颠簸,在您修复endnow并删除link_to之后,如上所述,您的helper_method操作可能如下所示:< / p>

    endnow