我的模型中有一个计数器,我想让用户有能力 重置它,我想知道实现这一目标的最佳途径是什么。我能想到 两种方式:
通过自定义控制器操作。
简单易行,但我无法决定使用哪种HTTP动词。我可以做到
它应该是GET
的情况,因为用户单击了重置的链接
计数器和结果总是相同的,即计数器
因为我们正在修改,它也可能是POST
/ PATCH
服务器上的某些内容,但POST
/ PATCH
需要一个表单
另一种方式。
通过提交编辑表单的链接,计数器重置为0而不是 用户看到表单。
我喜欢这个解决方案,因为它可以使用RESTful控制器完成 方法。但我不知道如何使用Rails,或者即使它是如此 可能的。
这是" Rails Way"去做这个?我该怎么做?
答案 0 :(得分:1)
不是创建自定义操作,另一种方法是创建一个命名良好的控制器并坚持使用RESTful控制器方法名称。
<强>配置/ routes.rb中强>
resource :counter_reset, only: [:create]
应用/控制器/ counter_reset_controller.rb 强>
class CounterResetController < ApplicationController
def create
# reset your counter
end
end
然后在您的视图中POST
到counter_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处理。
我不推荐使用表单方法的原因是,用户可能会使用它来更新您可能不想更新的不同属性,或者至少甚至将计数器更改为他们想要的任何数字,我更喜欢具体的要在控制器中定义的数字而不是视图/表单。