嵌套PARAM我哪里像6.50
Rails的修改控制器
当被保存在记录一个物有所值的用户类型,我想将它保存在仙像650
形式。
如何改变帕拉姆
center: { ticket_attributes: { value: '6.50' } }
到
center: { ticket_attributes: { value: '650' } }
在update
方法是什么?我无法改变它在模型的int
场就已经砍掉.50
嵌套PARAM我哪里像6.50
Rails的修改控制器
当被保存在记录一个物有所值的用户类型,我想将它保存在仙像650
形式。
如何改变帕拉姆
center: { ticket_attributes: { value: '6.50' } }
到
center: { ticket_attributes: { value: '650' } }
在update
方法是什么?我无法改变它在模型的int
场就已经砍掉.50
试试这个:
def method_where_you_want_to_change_params
if resource_params[:resource_name].present?
new_ticket_attributes = resource_params[:ticket_attributes]
param_to_change = new_ticket_attributes[:value]
param_to_change = params_to_change * 100
new_ticket_attributes[:value] = param_to_change
end
modified_params = resource_params
.except(:ticket_attributes)
.merge(:new_ticket_attributes)
# work with your resource as you need, create or modify
# for example
@resource = resource_class.new modified_params
end
protected
def resource_params
params.permit(... list of your params, as usual...)
end
是的,这是正常的做,在update
方法。请记住,由于您使用的是strong-parameters
,因此您不应该更改params
散列本身。
class TicketsController < ApplicationController
def update
# first, get whitelisted params
update_params = update_ticket_params
# then perform convertion
update_params[:value] = value_in_cents(update_params[:value])
@ticket.update(update_params)
# ...
end
private
def update_ticket_params
params.require(:ticket).permit(:value, ...)
end
def value_in_cents(value_in_dollars)
# TODO: convert dollars to cents
end
end
为了更好地理解我所谈论的和可能出现的问题看这个(Modify ruby hash in place(rails strong params))
另一种方法
您:相反,它是由strong-parameters
列入白名单后,改变结果参数哈希可以使用虚拟属性在模型级别上转换值。无论何时将虚拟属性(这是:value_in_dollars
),它会转换并分配value
属性:
class Ticket < ApplicationRecord
attr_accessor :value_in_dollars
# whenever you set :value_in_dollars, it converts and assigns :value
def value_in_dollars=(value)
self.value = value_in_cents(value)
end
private
def value_in_cents(value_in_dollars)
# TODO: convert dollars to cents
end
end
使用这种方法,你可以通过你的价值value_in_dollars
从形式。控制器将如下所示:
class TicketsController < ApplicationController
def update
@ticket.update(update_ticket_params)
# ...
end
private
def update_ticket_params
# expect 'value_in_dollars' value from the form, not 'value'
params.require(:ticket).permit(:value_in_dollars, ...)
end
end
请提供完整的控制器代码。 –
这是不好的做法,添加像这样的解决方法。像这样的事情可能会导致你不同,这将是一段时间后很难调试。为什么不只是在db中修改你的列来存储浮动和运行迁移,这会将你的整数修改为浮动? – Avdept