2011-04-25 71 views
1

我正在製作一個使用rails的網站,我迫切需要幫助我如何創建一個鏈接,點擊它時將更新數據庫中的一個屬性,但只有當卡嗒一聲。筆者有這樣的代碼:rails - 如何通過鏈接更改數據庫值

<%= link_to (myproperty_path) do %> 
<% @player.update_attribute("energy", @player.energy + 2) %><span>Take a Nap</span> 

<%end%> 

,但這樣做的問題是,每當我刷新頁面它更新的屬性,當我去到另一個網頁的網站上再次更新屬性。它在我點擊它時起作用,但我希望它只在點擊時才能工作,就是這樣。另外,如果我在同一頁面上有兩個這樣的鏈接,點擊一個鏈接就好像我在同一時間點擊兩個鏈接一樣。以下是我對myProperty的頁面:

<%= render 'sidebar' %> 
<div id="yui-main" class="yui-b"> 
<h2>My Property</h2> 
<br \> 
<p><b>Property: </b><%= @player.property %><br \><br \> 
<%= link_to (myproperty_path) do %> 
    <span>Take a Nap</span> 
    <% if @player.energy <= 98 && @player.energy != 100 %> 
    <% @player.update_attribute("energy", @player.energy + 2) %> 
<% end %> 
<% end %> 
<br \> 
<%= link_to (myproperty_path) do %> 
    <span>Sleep</span> 
    <% if @player.energy <= 96 && @player.energy != 100 %> 
    <% @player.update_attribute("energy", @player.energy + 4) %> 
<% end %> 
<% end %> 



<% if @player.property != "My Car" %> 
    <b>Rent: </b><br \> 
    <br \> 
    <b>Bedroom</b><br \> 
<% end %> 

當我點擊它增加了6球員的能量,而不是僅僅2或4 enter code here該鏈接的鏈接之一就是對myProperty的頁面,我希望它在單擊時返回到myproperty頁面。 我還沒有找到解決方案,我真的很感激,如果有人可以幫助我與此。

+0

非常感謝你們!我會去嘗試你說的道格並回復你。 – 2011-04-27 05:19:25

+0

我已將您的未註冊帳戶合併爲一個,您現在應該能夠評論您的問題及其答案,並接受幫助您的答案。 – 2011-04-27 07:30:37

回答

2

您不應該使用GET對服務器做任何更改。一些瀏覽器甚至「預取」鏈接在頁面上的數據,因此它可以在服務器上進行更改,而用戶不知道它。

無論何時在服務器上進行任何更改,始終使用POST,瀏覽器將再次詢問用戶是否要再次提交請求。

在CRUD - 創建,檢索,更新和刪除中,只能使用檢索GET,其他檢測通過POST完成。有關於使用PUTDELETE的說法,但實際上,它是通過使用_method參數或類似名稱的POST完成的。

參見:Why Ruby on Rails books or references always say Update is by PUT and Destroy is by DELETE when it is not?

+0

+1非常好陳述 – Spyros 2011-04-25 05:09:34

+0

這裏是一個大約2005年預取「問題」的鏈接:[谷歌加速器需要召回](http://www.loudthinking.com/arc/000454.html) – Zabba 2011-04-25 05:39:18

+0

使用GET v。POST是Pamela的例子中最小的問題。她應該使用Rails的MVC功能。在這一點上討論適當的http方法只會導致混淆。 – 2011-04-26 14:44:56

0

但是你的HTTP動詞進行,你的代碼中有一個概念的缺陷:

<%= link_to (myproperty_path) do %> 
<% @player.update_attribute("energy", @player.energy + 2) %><span>Take a Nap</span> 
<%end%> 

當你打開這個頁面,而產生@ player.update_attributes通話將閃光一次鏈接。實際的數據庫更改必須在控制器內發生(在這種情況下,myproperty_path的路由目標)。

另外我完全同意你應該使用POST請求。

8

你正在以一種根本不正確的方式解決這個問題。 Rails沒有被設計爲在你的視圖中擁有業務邏輯 - 特別是更新記錄的邏輯!

你想要的是什麼,你想要的東西,像

<%= link_to "Take a nap", {:controller => "player_actions", :action => "nap", :id => @player.id} %> 
<%= link_to "Sleep", {:controller => "player_actions", :action => "sleep", :id => @player.id } %> 
在你看來

,並在你的PlayerActionsController相應的控制器動作,或稱之爲

def nap 
    player = Player.find(params[:id]) 
    player.update_attribute(:energy, player.energy + 2) 
end 

def sleep 
    player = Player.find(params[:id]) 
    player.update_attribute(:energy, player.energy + 4) 
end 

這樣的行動只是發生當用戶點擊鏈接時。當然,你將需要處理任何重定向或ajax渲染,以及驗證等。但這通常是你的Rails代碼應該如何構造的。

相關問題