2017-09-25 1 views
0

에 중첩 PARAM을 나는레일 - 수정 컨트롤러

레코드가 저장되는 6.50 같은 돈 값의 사용자 유형, 나는 650처럼 센트에 저장하려는 형태를 갖는다.

은 어떻게 update 방법에서

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

에 PARAM

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

을 변경합니까? 난 이미 .50

+0

전체 컨트롤러 코드를 입력하십시오. –

+0

이렇게하는 것이 좋습니다. 이와 같은 일들은 나중에 다른 시간에 디버깅하기 힘든 rly가 될 당신을 이끌 수 있습니다. db에서 열을 수정하여 부동 소수점을 저장하고 마이 그 레이션을 실행하면 정수가 수레로 변경됩니다. – Avdept

답변

0

이 시도 오프 잘라합니다 모델 - 더 int 필드에서 변경할 수 없습니다

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 속성을 할당합니다 : 양식에서 value_in_dollars 같은 값을 전달할 수있는이 방법을 사용

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 

합니다. 컨트롤러는 다음과 같습니다 :

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