0

ヘルパーの1つに、ページのボタンがクリックされたときに実行したいメソッドがあります。問題は、ボタンのあるページが読み込まれるたびに、ボタンをクリックせずにメソッドが実行されることです。

それを止めるために私は何ができますか?私はこの方法を持っています:

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は、終了前の6行にあるものです。

4

1 に答える 1

2

onclickコードは期待どおりに機能します。メソッドに任意のオプションを渡しますlink_to(Ruby / Railsコードはサーバー側で実行されるため、onclickは機能しません)。これはRuby/Railsコード(ヘルパーがビューで使用可能なメソッドを公開する)であるため、ページがレンダリングされるたびにサーバー側で実行されます。このオプションの値が評価され、add_likeメソッドが呼び出されて、データベースが更新されます(update_attributesメソッドは実際にレコードの更新を実行します)。

ヘルパーはテンプレートをレンダリングするときにのみ使用できるため、「クリック時に」ヘルパーメソッドを実行することはできません。ページがレンダリングされると、サーバーへの呼び出しを実行するのはクライアント/ブラウザです。これはコントローラーの責任であるため、ビューからActiveRecordの作成/更新/破棄メソッドを呼び出さないでください。代わりに、リンクは、レコードを更新するコントローラーへのクライアント呼び出しをトリガーする必要があります。

MVCの優れた入門書として、Railsガイド、特にActionController関連のドキュメントを確認できます。

于 2013-01-05T03:46:10.453 に答える