Rails使用多个字段更新单个属性

我目前正在尝试创建一个名为countcash的表单,允许用户输入实际的季度,硬币,镍币,便士,二十,数十,五,一的数量,然后输入现金箱中任何其他项目的货币价值,然后当他们点击提交时,我想总计这些值并设置我当前class次记录的cashstart字段。

真正的问题是我不确定我的表单应该是什么样子以及在这种情况下应该如何设置控制器/模型。

我在session[:shift_id]变量中保存了shift_id,并且带有该id的shift是我想用计算的cashstart修改的class次。

如果我想正确地遵循MVC,那么标签需要看起来是什么?如何设置控制器/模型以使用计算值更新数据库? 我该怎么设置路线? 我在堆栈溢出或其他rails论坛上找不到这样的东西(尽管你认为通过多个文本字段修改单个属性会非常简单)

作为参考,这是我以前使用的forms(无济于事)

应用/视图/ countcash.html.erb

  
Coins
Quarters:
Dimes:
Nickels:
Pennies:
Bills
Twenties:
Tens:
Fives:
Ones:
Other
Value (in $):

这是我的shift_controller,目前没有做任何事情,因为我不确定在点击提交按钮后我需要如何更新属性

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

我想你几乎就在那里,大概你有一条命名的路线可以让你做这个表格声明:

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

如果有疑问,请在控制台中运行rake路由以确定是否存在此类路由。 如果没有,也许你会想要探索RESTful路由,它们在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 

如果你想获得更多的花哨,你可以做的是编写接受这些值的方法,所以你仍然将表单保留为当前状态,但添加接受值的方法并对其执行某些操作(如下所示)对于所有类型的货币,而不仅仅是硬币):

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

在您的控制器中,请执行以下操作:

 @shift.attributes = params[:shift] 

那么当你向模型传递属性的散列时,它将尝试根据符号名称分配值。 所以params中的dimes值将被传递,就像调用它一样:

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

我认为这应该适合你,假设你使用@running_total。 您可以使用@amount或其他东西,如果这是您已经拥有的模型属性。