我目前正在尝试在Rails 3中定义我的第一个新动作,尽管存在各种问题,我认为现在几乎已经完成了。但是,作为最后的障碍,我正在努力将正确的参数值发送到我的函数......
我的功能在items_controller
:
def clickcountplusone
clickeditem = Item.find(params[:id])
redirect_to clickeditem.externalurl if clickeditem.update_attribute(:click_count, clickeditem.click_count + 1)
end
routes.rb
包含:
match '/items/clickcountplusone', :to => 'items#clickcountplusone'
且view
包含:
<%= link_to image_tag( item.picture.to_s + ".gif", send("items_clickcountplusone_path", item.item_name)%>
视图页面本身正确加载(带有链接的页面),但是当我点击链接时出现错误:
Couldn't find Item with ID=clickcountplusone
{"id"=>"clickcountplusone",
"format"=>"whatever the name is"}
而不是转到外部页面,我的浏览器尝试加载:
http://localhost:3000/items/clickcountplusone.whatever the name is
任何人都可以告诉我应该如何调用该函数,以便ID为item_name
并访问外部网址而不是我网站上的错误网址?
提前致谢
答案 0 :(得分:1)
您的匹配声明中没有任何变量。尝试像
这样的东西match '/items/clickcountplusone/:id', :to => 'items#clickcountplusone'
和
<%= link_to image_tag(item.picture.to_s + ".gif", items_clickcountplusone_path(:id => item.item_name))%>
答案 1 :(得分:1)
这似乎是一个正常的路线,而不是RESTful路线(这很好)。有些地方你必须改变。
首先,在您的控制器操作中,您使用了params[:id]
,但实际上并没有设置。
在这种特殊情况下,我建议您使用params[:item_name]
代替id
,因为您实际上是在发送item_name
。
def clickcountplusone
clickeditem = Item.find_by_item_name(params[:item_name])
redirect_to clickeditem.externalurl if clickeditem.update_attribute(:click_count, clickeditem.click_count + 1)
end
只有当参数为Item.find
之一时才能使用 the actual id / :all / :first / :last
。
您正在item_name
找到,因此您应该使用Item.find_by_item_name
。
其次,你也必须更新你的路线(否则你需要像/you_path..?item_name=blahblahblah这样的东西,如果你不介意的话也很好)
get 'items/:item_name' => 'items#clickcountplusone', :as => :items_clickcountplusone
第三,你看。 IMO,大部分时间如果您使用的是send
但没有编写库/真正的后端代码,您可能会滥用它。
<%= link_to image_tag("#{item.picture.to_s}.gif"), items_clickcountplusone_path(:item_name => item.item_name) %>