0

所有,我正在尝试让自定义操作与 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 路由的相关行如下所示: endnow_post PUT /posts/:id/endnow(.:format) posts#endnow

但是,单击此链接时,操作 endnow 助手不会运行。奇怪的是,它确实使用 index 操作运行(我可以从 puts 命令中看出。当然,最终 endnow 的代码将更新 @post,但现在,它只是无法正常运行。

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

任何想法/替代方案?

4

1 回答 1

8

为什么不使用提供给您的 route helper 方法?将您的链接更改为

<%= 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控制器中的行,因为它不是您想要/不应该从您的视图中访问的东西。

这一切都可以通过使用 route helper 来避免(因为endnow_post您将附加_path以获取本地路由路径:)endnow_post_path,并将您的@post作为参数传递。

因为您正在尝试执行PUT请求,所以您必须确保您jquery-ujs的资产管道中包含类似的东西,以将这些链接转换为幕后的表单提交;浏览器不支持PUT通过点击自己的链接。


至于为什么在开始link_to工作时会出现模板错误,Rails 告诉您需要创建一个app/views/posts/endnow.html.erb文件。您的操作只有puts paramswhich 不会终止执行,让 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
于 2013-03-26T16:35:03.743 回答