所有,我正在尝试使用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,然后再显示它。
任何想法/替代品?
答案 0 :(得分:7)
为什么不使用提供给您的路线助手方法?将您的链接更改为
<%= link_to 'End now', endnow_post_path(@post), method: :put %>
你做错了什么:
:action
,请使用符号作为操作(您缺少冒号)。 :action => endnow
应为action: :endnow
@post
实例变量,您正在从控制器传递给您的操作。你应该使用它而不是post
(除非你确实有一个你从代码中省略的本地post
变量)endnow
作为动作;您应该删除控制器中的helper_method :endnow
行,因为它不是您希望/应该从您的视图中访问的内容。这可以通过使用路由助手来避免(对于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