【问题标题】:Rails Update Single Attribute with Multiple FieldsRails 使用多个字段更新单个属性
【发布时间】:2011-08-09 04:41:35
【问题描述】:

我目前正在尝试制作一个名为 countcash 的表格,该表格允许用户输入硬币的实际数量、硬币、五分钱、便士、二十、十、五、一,然后是现金中任何其他物品的货币价值框,然后当他们点击提交时,我想汇总这些值并设置我当前班次记录的 cashstart 字段。

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

我有一个 shift_id 保存在 session[:shift_id] 变量中,带有 id 的班次是我想用计算出的 cashstart 修改的班次。

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

仅供参考,这是我之前使用的表格(无济于事)

app/views/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 目前没有做任何事情,因为我不确定在单击提交按钮后我需要如何更新属性

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

    redirect_to(login_path)
end

【问题讨论】:

    标签: ruby-on-rails forms


    【解决方案1】:

    我想你快到了,大概你有一个命名路线,它允许你这样做作为你的表单声明:

    <%= 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 中的一角钱的值将被传入,就好像它被调用一样:

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

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

    【讨论】:

    • 模型/数据库中不存在个别字段,只有cashstart字段,预计为十进制值。这是我真正的问题——在用户点击提交按钮后,我如何访问硬币、五分钱、一角硬币等?
    • 添加了一个潜在的解决方案。
    • 编辑:已解决!我使用 if 检查来查看 params.has_key?(:quarters) 是否使我的控制器更新适用于我的 countcash 表单以及其他表单。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    相关资源
    最近更新 更多