2017-09-25 88 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