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

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,然后再显示它.

任何想法/替代品?

dee*_*our 7

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

<%= link_to 'End now', endnow_post_path(@post), method: :put %>
Run Code Online (Sandbox Code Playgroud)

你做错的事:

  1. 如果要指定:action,请使用符号作为操作(您缺少冒号). :action => endnow应该action: :endnow
  2. 我假设您有一个@post实例变量,您正在从控制器传递给您的操作.您应该使用它而不是post(除非您实际上有一个post您从代码中省略的局部变量)
  3. 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)