0

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

我能做些什么来阻止它?我有这个方法:

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 是结束前六行的那个。

4

1 回答 1

2

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

您不能在“单击时”运行辅助方法,因为辅助方法仅在呈现模板时可用。一旦页面被渲染,客户端/浏览器就可以执行对服务器的调用。您不应该从视图调用 ActiveRecord 创建/更新/销毁方法,因为这是控制器的职责。相反,您的链接应该触发对控制器的客户端调用,该控制器将更新记录。

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

于 2013-01-05T03:46:10.453 回答