2011-08-09 31 views
2

我目前正在嘗試製作一個名爲countcash的表單,該表單允許用戶輸入實際數量的宿舍,硬幣,鎳幣,便士,二十幾歲,五十幾歲,然後是貨幣值的現金箱中的任何其他物品,然後當他們提交時,我想要總計這些值並設置我當前班次記錄的cashstart字段。Rails更新多個字段的單個屬性

真正的問題是,我不確定我的窗體應該是什麼樣子,以及在這種情況下應如何設置控制器/模型。

我保存在一個session[:shift_id]變量,並與id移位一個shift_id是,我想與計算cashstart修改的轉變。

如果我想正確地關注MVC,並且如何設置控制器/模型以使用計算值更新數據庫,<%= form_for %>標記需要看起來像什麼?我應該怎樣設定路線?我無法在堆棧溢出或其他軌道論壇上找到類似的東西(儘管您認爲通過多個文本字段修改單個屬性將非常直接)

就像一個參考,這是表單我以前使用(無濟於事)

應用程序/視圖/ countcash.html.erb

<%= form_for @shift do |f| %> 

<table> 
    <tr> 
    <th>Coins</th> 
    <th></th> 
    </tr> 

    <tr> 
    <td>Quarters: </td> 
    <td><%= f.text_field :quarters %><br /></td> 
    </tr> 

    <tr> 
    <td>Dimes: </td> 
    <td><%= f.text_field :dimes %><br /></td> 
    </tr> 

    <tr> 
    <td>Nickels: </td> 
    <td><%= f.text_field :nickels %><br /></td> 
    </tr> 

    <tr> 
    <td>Pennies: </td> 
    <td><%= f.text_field :pennies %><br /></td> 
    </tr> 

    <tr> 
    <th>Bills</th> 
    <th></th> 
    </tr> 

    <tr> 
    <td>Twenties: </td> 
    <td><%= f.text_field :twenties %><br /></td> 
    </tr> 

    <tr> 
    <td>Tens: </td> 
    <td><%= f.text_field :tens %><br /></td> 
    </tr> 

    <tr> 
    <td>Fives: </td> 
    <td><%= f.text_field :fives %><br /></td> 
    </tr> 

    <tr> 
    <td>Ones: </td> 
    <td><%= f.text_field :ones %><br /></td> 
    </tr> 

    <tr> 
    <th>Other</th> 
    <th></th> 
    </tr> 

    <tr> 
    <td>Value (in $): </td> 
    <td><%= f.text_field :others %><br /></td> 
    </tr> 


</table> 

<div class="actions"> 
    <%= f.submit %> 
</div> 
<% end %> 

這是我的shifts_controller不會在此刻做任何事情,因爲我不知道怎麼樣點擊提交按鈕後,我需要去更新屬性

def countcash 
    @shift = Shift.find(session[:shift_id]) 

    redirect_to(login_path) 
end 

回答

5

我認爲你是幾乎沒有,想必你有一個名爲路線,它允許你這樣做,因爲你的窗體聲明:

<%= form_for @shift, :url => countcash_shift_path(@shift) do |f| %> 

如有疑問,運行耙路線在控制檯,以確定這種路線存在。如果沒有,也許你會想探索REST風格的路線,這應該是在你的routes.rb這樣的事情:

resources :shifts 

裏面在你的控制器的countcash作用,它只是一個這樣做之事:

@shift = Shift.find(session[:id]) 
@shift.update_attributes(params[:shift] 

這應該工作,假設您已經爲您的班次資源設置了RESTful路線。此外,我假設你的模型/數據庫是作爲單個字段設置爲宿舍,角錢等(否則你需要比update_attributes更先進的)。

由於您沒有在數據庫中包含這些單個字段(根據您的評論),因此您不應將其作爲模型表單的一部分。因此,而不是:

<%= f.text_field :dimes %> 

你會做這樣的事情:

<%= text_field_tag :dimes, params[:dimes] %> 

而且你的控制器內,你可以訪問他們像這樣:

params[:dimes] + params[:quarters] # multiply as per currency logic 

如果你想獲得有點花哨,你可以做的是寫入方法,這些值接受這些值,所以你仍然保留當前狀態的形式,但添加方法來接受值並像這樣做一些事情(對於所有類型的curre NCY,不只是硬幣):

def dimes=(value) 
    @running_total += value 
end 

在你的控制,這樣做,而不是:

@shift.attributes = params[:shift] 

那麼,什麼情況是,當你通過你的模型屬性的哈希值,它會嘗試分配基於符號名稱的值。所以硬幣的params中的值將被傳遞,就好像這是被稱爲:

@shift.dimes = params[:shift][:dimes] 

我覺得應該爲你工作,假設你使用@running_total的東西。如果這是您已經擁有的模型屬性,那麼您可以使用@amount或其他東西。

+0

單個字段不存在於模型/數據庫中,只有cashstart字段,預期爲十進制值。這是我真正的問題 - 在用戶點擊提交按鈕後,如何訪問宿舍,鎳幣,硬幣等? – jyanks

+0

添加了一個潛在的解決方案。 – Jaryl

+0

編輯:解決!我使用if檢查來查看params.has_key?(:quarters)是否使我的控制器的更新工作適用於我的countcash表單以及其他工作。非常感謝你的幫助! – jyanks