我有一个实例,我在记录供应商的水价。我的供应商模型有:price
。但是,我想让用户选择输入不同数量的价格,并为他们做简单的划分,而不是让他们这样做。换句话说,用户应该能够输入每升1.99美元或每加仑3.99美元的价格,依此类推。为此,我需要在表单中添加一个虚拟属性:unit
,因为我不想在表中存储单位。一切正常,除了vendor_params[:price]
在更新记录或创建新记录之前似乎无法更新之外。这似乎应该走个小路,但是我一天中的大部分时间都在Google上搜索,因此不知道如何使它工作。
这是我所拥有的:
模型:
class Vendor < ActiveRecord::Base
attr_accessor :unit
...
end
形式:
<%= form_for(@vendor) do |f| %>
...
<div class="field">
<%= f.label :price %><br>
<%= f.text_field :price %>
<%= select( "unit", "id", { "1 Liter" => "1", "Bottle (2 liters)" => "2", "Jerry Can (20 liters)" => "20"}) %>
</div>
...
<% end %>
控制器:
...
def update
vendor_params[:price] = vendor_params[:price].to_f/params[:unit][:id].to_f
respond_to do |format|
if @vendor.update(vendor_params)
format.html { redirect_to @vendor, notice: 'Vendor was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @vendor.errors, status: :unprocessable_entity }
end
end
...
end
我知道vendor_params[:price].to_f/params[:unit][:id].to_f
返回正确的值。我似乎无法vendor_params[:price]
在更新记录之前将该值分配给该值。我还尝试了以下引发错误的操作:
@vendor_params[:price] = vendor_params[:price].to_f/params[:unit][:id].to_f
看来这应该是微不足道的!我想我可以使用form_tag
代替form_for
,但是在更新完整记录时似乎很奇怪。(编辑表单具有所有对象属性的所有字段。)任何人,我都欢迎提出想法和建议。
谢谢!!
如果vendor_params是strong_params方法(我假设是),那么它实际上会创建一个新的哈希。因此,当您更改vendor_params ...时,您实际上并没有更改原始的params哈希。
好的,为什么vendor_params没变...我不在乎params?好吧,vendor_params仍然指向原始params哈希,假设它看起来像:
def vendor_params
params.require(:vendor).permit(:price)
end
我认为下面的链接是一个类似的问题,可能会提出一个有用的解决方案。希望我能正确理解您的问题!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句