帮助程序代码在页面加载时错误运行

时间:2013-01-05 02:30:54

标签: ruby-on-rails

我的一个帮助器中有一个方法,我想在我的页面上单击一个按钮时运行该方法。 问题是每当加载按钮的页面加载时,该方法都会在没有任何按钮点击的情况下执行。

我该怎么做才能阻止它? 我有这个方法:

private
def add_like(item)  
a = current_user.exp + 50
current_user.update_attributes(exp: a)
b = item.likes + 1
item.update_attributes(likes: b)
end

这个想法当然是更新一些项目喜欢并向用户添加点数。 但它每次都会发生核心。

观点:

<fieldset style="height:200px;overflow:auto;">
<legend><h3>הזמנות אחרונות שלי</h3></legend>
<% current_user.orders.reverse[0..14].each do |o| %>
<%= o.food_item.likes %>
הזמנה - #<%= o.id %><br>
<% food = FoodItem.find(o.food_item) %>
<%= Provider.find(food.provider_id).name %><br>
תאריך הזמנה: <%= o.created_at.strftime("%d/%m/%Y") %><br>
מחיר - <%= o.price %><br>
<%=  link_to image_tag("/images/like.jpg",size:"35x35"),"#", onclick:    add_like(o.food_item), :method => :put%>
<%=  link_to image_tag("/images/feedback.jpg",size:"75x75"),"#" %><br>
<br>
<%= image_tag(FoodItem.find(o.food_item).photo, size:"120x120") %>  
<% end  %>
</fieldset> 

link_to是结尾前六行的那个。

1 个答案:

答案 0 :(得分:2)

您的代码完全符合预期:您正在向onclick方法传递任意link_to选项(因为Ruby / Rails代码在服务器端执行,所以onclick将无效)。由于它是Ruby / Rails代码(帮助程序公开可用于视图的方法),因此每次呈现页面时都会在服务器端执行 。评估此选项的值并调用add_like方法,从而导致数据库更新(update_attributes方法实际执行记录更新)。

由于帮助程序仅在呈现模板时可用,因此无法在“单击”时运行辅助方法。页面呈现后,客户端/浏览器将执行对服务器的调用。您不应该从视图中调用ActiveRecord create / update / destroy方法,因为这是控制器的责任。相反,您的链接应该触发客户端调用更新记录的控制器。

作为对MVC的一个很好的介绍,您可以查看Rails指南,特别是ActionController相关文档。