当前位置:  开发笔记 > 后端 > 正文

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

如何解决《Rails使用多个字段更新单个属性》经验,为你挑选了1个好方法。

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

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

我有一个shift_id保存在一个session[:shift_id]变量中,其中id的转移是我想用计算的cashstart修改的转移.

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

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

应用/视图/ countcash.html.erb

<%= form_for @shift do |f| %>   

Coins
Quarters: <%= f.text_field :quarters %>
Dimes: <%= f.text_field :dimes %>
Nickels: <%= f.text_field :nickels %>
Pennies: <%= f.text_field :pennies %>
Bills
Twenties: <%= f.text_field :twenties %>
Tens: <%= f.text_field :tens %>
Fives: <%= f.text_field :fives %>
Ones: <%= f.text_field :ones %>
Other
Value (in $): <%= f.text_field :others %>
<%= f.submit %>
<% end %>

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

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

    redirect_to(login_path)
end

Jaryl.. 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或其他东西,如果这是您已经拥有的模型属性.



1> Jaryl..:

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

<%= 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或其他东西,如果这是您已经拥有的模型属性.

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有