使用非模型表单字段更新单个属性

时间:2011-08-06 23:41:33

标签: ruby-on-rails

我有一个名为cashcount的页面,在页面上,我希望用户能够输入季度,角钱,镍币,便士(数量,而不是价值),每种账单数量等的数量进入表单的文本字段。

当用户点击按钮提交数据时,我想自动将所有字段汇总到它们的货币值中,并将其存储在我的shifting.startcash字段(十进制类型)中。

设置此表单的最佳方法是什么?

这是我的pages_controller.rb

# Cash Count
def cashcount
  @title = "Count Cashbox"
  @shift = Shift.find(session[:shift_id])
end

我知道在我的shift的控制器中,我可能想要制作一个def update_cashstart之类的方法,以便我可以从文本字段中获取值并总结它们,但我不确定如何去这样做。

更新代码:

这是我写的,但它似乎没有更新任何东西:

countcash.html.erb:

<%= form_for :shift do |f| %>
    <div class="coins">
    Coins: <br />
    Quarters: <%= f.text_field :quarters %><br />
    Dimes: <%= f.text_field :dimes %><br />
    Nickels: <%= f.text_field :nickels %><br />
    Pennies: <%= f.text_field :pennies %><br /><br />
    </div>
    <div class="bills">
    Bills: <br />
    Twenties: <%= f.text_field :twenties %><br />
    Tens: <%= f.text_field :tens %><br />
    Fives: <%= f.text_field :fives %><br />
    Ones: <%= f.text_field :ones %><br /><br />
    </div>
    <div class="other">
    Please enter the dollar amount of any other money in the drawer:
    Other: <%= f.text_field :others %>
    </div>
    <div class="actions">
    <%= f.submit %>
    </div>
<% end %>

Shift.rb

before_save :sum_coinage, :unless => :all_coins_blank?
def all_coins_blank?
    if (@quarters.nil? and @nickels.nil? and @dimes.nil? and @pennies.nil? and @twenties.nil? and @tens.nil? and @fives.nil? and @ones.nil? and @others.nil?)
        true
    else
        false
    end
end

def sum_coinage
    self.cashstart = ((@quarters * 0.25) + (@nickels * 0.05) + (@dimes * 0.10) + (@pennies * 0.01) + (@twenties * 20) + (@tens * 10) + (@fives * 5) + @ones + @others)
end

这是rails服务器的输出:

Started POST "/countcash" for 127.0.0.1 at Mon Aug 08 17:22:30 -0400 2011
 Processing by PagesController#countcash as HTML
Parameters: {"commit"=>"Save Shift", "shift"=>{"quarters"=>"55", "others"=>"", "tens"=>"", "fives"=>"", "dimes"=>"5", "ones"=>"", "pennies"=>"", "twenties"=>"", "nickels"=>""}, "authenticity_token"=>"IQsaKJARVrQOveEC/UTll2iFZ0OWvRmvNxGkqI6DRLE=", "utf8"=>"✓"}

它似乎并没有将这些更新推送到实际数据库:|

1 个答案:

答案 0 :(得分:1)

这是你应该在你的模型中做的事情。我会为你想要的每种面额创建一个虚拟属性(一个实际上不由数据库支持的模型属性)。然后,您可以对硬币值求和,并使用before_create过滤器进行分配。

class Shift < ActiveRecord::Base
  attr_accessor :quarters, :nickels, :dimes, :etc
  before_create :sum_coinage

  def sum_coinage
    self.startcash = (@quaters * 0.25) + (@nickels * 0.05) + (@dimes * 0.10)
  end
end

然后你的视图可以使用普通输入字段来表示不同的硬币

<% form_for :shift do |f| %>
  <%= f.text_field :quarters %>
  <%= f.text_field :nickels %>
  etc
<% end %>