2017-09-25 65 views
0

嵌套PARAM我哪里像6.50Rails的修改控制器

当被保存在记录一个物有所值的用户类型,我想将它保存在仙像650形式。

如何改变帕拉姆

center: { ticket_attributes: { value: '6.50' } }

center: { ticket_attributes: { value: '650' } }

update方法是什么?我无法改变它在模型的int场就已经砍掉.50

+0

请提供完整的控制器代码。 –

+0

这是不好的做法,添加像这样的解决方法。像这样的事情可能会导致你不同,这将是一段时间后很难调试。为什么不只是在db中修改你的列来存储浮动和运行迁移,这会将你的整数修改为浮动? – Avdept

回答

0

试试这个:

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 
0

是的,这是正常的做,在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