使用链接重置ActiveRecord属性的最佳方法

时间:2015-02-08 06:17:34

标签: ruby-on-rails ruby-on-rails-4

我的模型中有一个计数器,我想让用户有能力 重置它,我想知道实现这一目标的最佳途径是什么。我能想到 两种方式:

  1. 通过自定义控制器操作。

    简单易行,但我无法决定使用哪种HTTP动词。我可以做到 它应该是GET的情况,因为用户单击了重置的链接 计数器和结果总是相同的,即计数器 因为我们正在修改,它也可能是POST / PATCH 服务器上的某些内容,但POST / PATCH需要一个表单 另一种方式。

  2. 通过提交编辑表单的链接,计数器重置为0而不是 用户看到表单。

    我喜欢这个解决方案,因为它可以使用RESTful控制器完成 方法。但我不知道如何使用Rails,或者即使它是如此 可能的。

  3. 这是" Rails Way"去做这个?我该怎么做?

2 个答案:

答案 0 :(得分:1)

不是创建自定义操作,另一种方法是创建一个命名良好的控制器并坚持使用RESTful控制器方法名称。

<强>配置/ routes.rb中

resource :counter_reset, only: [:create]

应用/控制器/ counter_reset_controller.rb

class CounterResetController < ApplicationController
  def create
    # reset your counter
  end
end

然后在您的视图中POSTcounter_reset_path

就个人而言,我会使用button_to - 这会生成一个提交到URL的按钮;它默认执行POST操作。如果您不喜欢按钮样式,可以切换到使用link_to;但是,请注意,如果用户禁用了JavaScript,请求将回退到使用GET

<%= button_to "Reset counter!", counter_reset_path %>
<%= link_to "Reset counter!", counter_reset_path, method: :post %>

http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-button_to http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to

<强>更新

如果您不想创建新控制器,可以创建一个映射到现有控制器中自定义操作的新路径:

<强>配置/ routes.rb中

resources :counters do
  post :reset, to: "counters#reset"
end

应用/控制器/ counters_controller.rb

class CountersController < ApplicationController
  def reset
    # reset your counter
  end
end

在您看来:

<%= button_to "Reset counter!", counter_reset_path %>

答案 1 :(得分:0)

实际上你不需要表格,对我来说我会添加一个新动作,它看起来像这样(当然取决于你当前的路线是什么样的)

/user/:id/counter/reset # with action = post

链接非常简单,您只需创建link_to并添加method: :post,这将在html中添加data-method: :post,其余的将由不显眼的js处理。

我不推荐使用表单方法的原因是,用户可能会使用它来更新您可能不想更新的不同属性,或者至少甚至将计数器更改为他们想要的任何数字,我更喜欢具体的要在控制器中定义的数字而不是视图/表单。