添加一个简单的链接以在 Rails 中设置一个布尔字段 - 似乎没有发生任何事情
Posted
技术标签:
【中文标题】添加一个简单的链接以在 Rails 中设置一个布尔字段 - 似乎没有发生任何事情【英文标题】:Add a simple link to set a boolean field in Rails - nothing seems to happen 【发布时间】:2011-01-30 13:01:14 【问题描述】:我正在尝试向 Rails 视图添加链接,以便在单击布尔字段时将其设置为 true。在控制器(present_controller.rb)中,我有以下代码:
def taken_toggle
@matching = Present.find(params[:id])
@matching.taken = true
@matching.save
end
在相关视图中我有以下代码:
<%= link_to "I want to buy this present", :url => :action => "taken_toggle", :id => @present.id %>
但是,当我单击按钮时,没有任何反应。如果我返回主列表,则布尔字段尚未更新。在日志中我得到以下信息:
Started GET "/presents/2/edit?url[action]=taken_toggle&url[id]=2" for 152.78.101.154 at Sun Jan 30 04:56:34 -0800 2011
Processing by PresentsController#edit as html
Parameters: "url"=>"action"=>"taken_toggle", "id"=>"2", "id"=>"2"
Rendered presents/_form.html.erb (6.0ms)
Rendered presents/edit.html.erb within layouts/application (10.0ms)
Completed 200 OK in 13ms (Views: 10.7ms | ActiveRecord: 0.9ms)
我确定我错过了一些非常简单的东西 - 有人知道它是什么吗?
更新:我已添加路线,rake routes
现在提供以下行(在所有正常路线中):
taken_toggle_present PUT /presents/:id/taken_toggle(.:format) :controller=>"presents", :action=>"taken_toggle"
我应该将链接更改为什么才能使其正常工作?目前链接还在:
<%= link_to "I want to buy this present", :url => :action => "taken_toggle", :id => @present.id %>
但这对我来说似乎是正确的,因为它会采取正确的行动,并传递 ID。有什么想法吗?
更新: 我尝试了最新的答案,但它们都导致以下日志错误:
Started GET "/presents/2/taken_toggle" for 86.150.141.2 at Fri Feb 04 01:37:23 -0800 2011
ActionController::RoutingError (No route matches "/presents/2/taken_toggle"):
鉴于上面rake routes
的输出,这似乎有点奇怪。有什么想法吗?
【问题讨论】:
【参考方案1】:您似乎在使用 rails 3 应用程序。获取方法(GET、PUT)和正确的路由应该可以工作。
路由部分,或者在presents资源中定义taken_toggle,像这样:
资源:礼物做 会员做 放:taken_toggle 结尾 结尾或者只是按照 Nikita 的建议使用 match:
匹配 'presents/:id/taken_toggle', :as => "taken_toggle_present", :to => "礼物#taken_toggle"现在是链接部分:
<%= link_to "I want to buy this present", taken_toggle_present_path(@present), :method => :put %>
【讨论】:
【参考方案2】:您的路线需要一个 PUT 请求。试试这个:
<%= link_to "I want to buy this present", taken_toggle_present_path(@present), :method => :put %>
【讨论】:
谢谢。我已经这样做了,但是遇到了关于路由的错误 - 请参阅上面问题的更新 - 这一定是我做过的愚蠢的事情! 您的错误表明您仍在执行获取请求。您是否按照@dmarkow 的建议指定了:method
?【参考方案3】:
link_to
不接受 :url
选项,因此它将您的 :url
哈希中的所有内容转换为 GET 参数:您可以在日志的请求路径中看到它们:
GET "/presents/2/edit?url[action]=taken_toggle&url[id]=2"
您应该能够取出:url =>
部分以使链接正常工作:
link_to "I want to buy this present", :action => "taken_toggle", :id => @present.id
但是,一般而言,指定指向静止操作的链接的首选方法是使用path helper:
link_to "I want to buy this present", taken_toggle_present_path(@present)
【讨论】:
谢谢。听起来不错,但我收到路由错误(请参阅上面问题的更新)。有什么想法吗? 添加到 routes.rb 这一行match 'presents/:id/taken_toggle' => 'presents/taken_toggle', :as => 'taken_toggle_present'
谢谢@Nikita - 但这给了我一个错误,说“缺少:action” - 你知道出了什么问题吗?
@Nikita 我设法通过更改 presents/taken_toggle' to
presents#taken_toggle' 解决了这个问题
@robintw - 对不起,我的错字。太好了,你把它整理出来了)【参考方案4】:
打开你的shell并运行rake routes
;您应该会看到 taken_toggle
操作的宁静路线。
如果找不到,你想add your new restful action。再次运行rake routes
。
在您的链接中使用该路线。
考虑从 GET 切换到 POST,因为该操作会更改数据的状态。
【讨论】:
PUT 可能更好,因为它似乎正在更新现有对象的状态 谢谢。我已经使用 PUT 添加了路线,但我不确定如何更改链接 - 我已经发布了有关此问题的更新。有什么想法吗?【参考方案5】:鉴于您使用的是 PUT 路由,您应该创建一个使用 PUT 作为执行此操作的方法的表单。
虽然它可能违反 REST 范例,但如果您想通过简单链接执行此操作,我建议您创建一个 GET 路由。不要认为该链接上的任何点击都会改变对象状态。
【讨论】:
以上是关于添加一个简单的链接以在 Rails 中设置一个布尔字段 - 似乎没有发生任何事情的主要内容,如果未能解决你的问题,请参考以下文章
使用 RSpec 测试 Rails 辅助方法时如何在参数哈希中设置值?