问题在Rails中向新操作发送值3

时间:2011-06-24 08:40:53

标签: ruby-on-rails ruby-on-rails-3

我目前正在尝试在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并访问外部网址而不是我网站上的错误网址?

提前致谢

2 个答案:

答案 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) %>