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

Ruby on rails 使用非模型表单字段更新单个属性,ruby-on-rails,Ruby On Rails,我有一个名为cashcount的页面,在该页面上,我希望用户能够在表单的文本字段中键入25美分、10美分、5美分、1美分(数量,而不是价值)、每种票据的数量等 当用户单击按钮提交数据时,我希望自动将所有字段汇总为货币值,并将其存储在我的shifts.startcash字段(类型为decimal)中 设置此表单的最佳方式是什么 这是我的网页。\u controller.rb # Cash Count def cashcount @title = "Count Cashbox" @shift

我有一个名为cashcount的页面,在该页面上,我希望用户能够在表单的文本字段中键入25美分、10美分、5美分、1美分(数量,而不是价值)、每种票据的数量等

当用户单击按钮提交数据时,我希望自动将所有字段汇总为货币值,并将其存储在我的shifts.startcash字段(类型为decimal)中

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

这是我的网页。\u controller.rb

# Cash Count
def cashcount
  @title = "Count Cashbox"
  @shift = Shift.find(session[:shift_id])
end
我知道,在我的班次控制器中,我可能会想使用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 %>
这是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"=>"✓"}

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

这是您应该在模型中执行的操作。我将为您想要的每种面额创建一个虚拟属性(一个实际上不受数据库支持的模型属性)。然后,您可以对硬币值求和,并使用“创建前”过滤器对其进行分配

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
classshift
然后,您的视图可以对不同的硬币使用正常的输入字段,如下所示

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

这是您应该在模型中执行的操作。我将为您想要的每种面额创建一个虚拟属性(一个实际上不受数据库支持的模型属性)。然后,您可以对硬币值求和,并使用“创建前”过滤器对其进行分配

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
classshift
然后,您的视图可以对不同的硬币使用正常的输入字段,如下所示

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

这是否违反了MVC模式,我看到的问题是轮班已经创建好了。计数现金步骤是一个单字段更新,它不违反MVC,事实上这正是模型的目的。我的解决方案是从控制器中隐藏数据的业务逻辑。将其放入控制器将违反MVC。如果每次更新都需要求和,则将“创建前”更改为“保存前”。您还需要避免将零赋值给startcash时所有数据都为空的情况
保存之前:sum\u coins,:除非=>:all\u coins\u blank?
,然后定义
:all\u coins\u blank?
,如果所有硬币变量都为零,则返回true。Ehren-感谢您在这方面的帮助。我更新了代码,但它仍然不会将更改推送到数据库。我从原来的帖子中编辑了我的代码。我遗漏了什么?可能是因为它们被指定为params的字符串。您必须调用
.to\u i
sum\u coinage
中的所有实例变量执行操作,这是否违反了MVC模式,我看到的问题是移位已经创建。计数现金步骤是一个单字段更新,它不违反MVC,事实上这正是模型的目的。我的解决方案是从控制器中隐藏数据的业务逻辑。将其放入控制器将违反MVC。如果每次更新都需要求和,则将“创建前”更改为“保存前”。您还需要避免将零赋值给startcash时所有数据都为空的情况
保存之前:sum\u coins,:除非=>:all\u coins\u blank?
,然后定义
:all\u coins\u blank?
,如果所有硬币变量都为零,则返回true。Ehren-感谢您在这方面的帮助。我更新了代码,但它仍然不会将更改推送到数据库。我从原来的帖子中编辑了我的代码。我遗漏了什么?可能是因为它们被指定为params的字符串。您必须调用
.to\u i
sum\u coinage