添加一个简单的链接以在 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 =&gt; 部分以使链接正常工作:

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' =&gt; 'presents/taken_toggle', :as =&gt; '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 辅助方法时如何在参数哈希中设置值?

在 XML 中设置提示点以在 Flash 视频中使用

有条件地在 JSF 组件标签中设置一个属性

如何使用 wp_insert_post 在 wordpress 中设置 POST 永久链接/slug

减少数组以在 Swift 中设置

在 Rails 3 中设置会话超时