GG_*_*hon 0 ruby-on-rails ruby-on-rails-3.2
所有,我正在尝试使用put方法进行自定义操作:在
在_post.html.erb中我有一个link_to语句:
<%= link_to 'End now', post, :method => :put, :action => endnow %>
Run Code Online (Sandbox Code Playgroud)
routes.rb包含:
resources :posts do
member do
put :endnow
end
Run Code Online (Sandbox Code Playgroud)
和posts_controller.rb看起来像:
class PostsController < ApplicationController
helper_method :endnow
[.. code for create, edit, destroy, etc ..]
def endnow
puts params
end
end
Run Code Online (Sandbox Code Playgroud)
rake routes的相关行看起来像:endnow_post PUT /posts/:id/endnow(.:format)帖子#endnow
但是,单击此链接时,操作endnow帮助程序不会运行.奇怪的是,它确实运行了一个索引操作(我可以从puts命令中判断出来.当然,最终endnow的代码将更新@post,但是现在,它只是运行不正常.
也许我正在以错误的方式解决这个问题 - 我想要实现的是在点击指向该帖子的链接时更新@post,然后再显示它.
任何想法/替代品?
为什么不使用提供给您的路径助手方法?将您的链接更改为
<%= link_to 'End now', endnow_post_path(@post), method: :put %>
Run Code Online (Sandbox Code Playgroud)
你做错的事:
:action,请使用符号作为操作(您缺少冒号). :action => endnow应该action: :endnow@post实例变量,您正在从控制器传递给您的操作.您应该使用它而不是post(除非您实际上有一个post您从代码中省略的局部变量)endnow用作一个动作; 您应该删除helper_method :endnow控制器中的行,因为它不是您希望/应该从您的视图中访问的内容.这可以通过使用路由助手来避免(因为endnow_post你要追加_path获取本地路径路径:) endnow_post_path,并传入你@post的参数.
因为您正在尝试执行PUT请求,所以您必须确保jquery-ujs在资产管道中包含类似的内容,以便将这些链接转换为幕后提交的内容; 浏览器不支持PUT通过点击链接自己.
至于为什么你在工作时遇到模板错误link_to,Rails告诉你需要创建一个app/views/posts/endnow.html.erb文件.您的操作只有puts params哪个不会终止执行,让Rails假设您仍在尝试渲染一些endnow.html.erb模板.
是否有其他方法可以执行您要执行的操作(更改特定模型的单个属性)?当然.还有更好的方法吗?那是非常主观的; 它可能不是最RESTful的方式,但它可以说更容易处理(例如,在更新你正在修改的属性之前,有非常具体的授权规则要检查endnow.你的方式是否开始充实工作?绝对.
最后,作为正确方向的碰撞,在您修复link_to并删除helper_method上面描述的之后,您的endnow操作可能如下所示:
def endnow
post = Post.find!(params[:id])
post.some_attribute_here = some_new_value_here
post.save
redirect_to :root and return # <- this line sets a redirect back to your homepage and terminates execution, telling rails to do the redirect and **not** to render some endnow.html.erb file
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3174 次 |
| 最近记录: |