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

时间:2011-08-09 04:41:36

标签: ruby-on-rails forms

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

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

我有一个shift_id保存在session[:shift_id]变量中,而id的转变是我想用计算的现金启动修改的转变。

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

作为参考,这是我之前使用的形式(无济于事)

应用程序/视图/ 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 %>

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

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

    redirect_to(login_path)
end

1 个答案:

答案 0 :(得分:5)

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

<%= 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或其他东西,如果你已经拥有它作为模型属性。