2011-08-09 19 views
2

私は現在、四角、十字、ニッケル、ペニー、20代、私が現在のシフトレコードのキャッシュスタートフィールドを設定したいと思っています。複数のフィールドを持つ単一の属性を更新する

本当の問題は、私のフォームがどのように見えるのか、コントローラ/モデルがこのインスタンスでどのように設定されるのかが分かりません。

私はsession[:shift_id]変数に保存されているshift_idを持っています。そのidのシフトは、計算されたキャッシュスタートで変更したいシフトです。

<%= form_for %>タグはMVCに正しく従いたいと思うのですが、コントローラ/モデルを設定して計算された値でデータベースを更新するにはどうすればよいですか?そして、私はどのように経路を設定すべきですか?私はスタックオーバーフローや他のレールフォーラムでこれを見つけることはできません(複数のテキストフィールドを使って単一の属性を変更するのはかなり簡単だと思いますが)

参考のため、私はどのようにわからないので、ここで

アプリ/ビュー/ 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です(無駄に)以前に使用していました送信ボタンをクリックした後に属性を更新する必要があります。

このようかどうかを判断するには、コンソールで

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

疑わしい場合は、実行すくい路線:

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

    redirect_to(login_path) 
end 

答えて

5

私はおそらくあなたがあなたのフォームの宣言としてこれを行うことができますという名前のルートを持っている、あなたはほとんどそこにあると思います経路が存在する。そうでない場合は、おそらくあなたはroutes.rbをして次のようになりますRESTfulなルートを、探求したいと思う:あなたのコントローラでcountcashアクションインサイド

resources :shifts 

を、それがこれをするだけです:

@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

個々のフィールドはモデル/データベースには存在しません。小数点以下の桁数のフィールドが必要です。これは私の本当の問題です。ユーザーが送信ボタンを押した後に四半期、ニッケル、ダイムなどにアクセスするにはどうすればよいですか? – jyanks

+0

潜在的な解決策に追加されました。 – Jaryl

+0

編集:解決済み! ifチェックを使用してparams.has_key(:四半期)が私のcountcashフォームのコントローラの更新を他のものと同様にするかどうかを確認しました。手伝ってくれてどうもありがとう! – jyanks

関連する問題