에 중첩 PARAM을 나는레일 - 수정 컨트롤러
레코드가 저장되는 6.50
같은 돈 값의 사용자 유형, 나는 650
처럼 센트에 저장하려는 형태를 갖는다.
은 어떻게 update
방법에서
center: { ticket_attributes: { value: '650' } }
에 PARAM
center: { ticket_attributes: { value: '6.50' } }
을 변경합니까? 난 이미 .50
에 중첩 PARAM을 나는레일 - 수정 컨트롤러
레코드가 저장되는 6.50
같은 돈 값의 사용자 유형, 나는 650
처럼 센트에 저장하려는 형태를 갖는다.
은 어떻게 update
방법에서
center: { ticket_attributes: { value: '650' } }
에 PARAM
center: { ticket_attributes: { value: '6.50' } }
을 변경합니까? 난 이미 .50
이 시도 오프 잘라합니다 모델 - 더 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
네, 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
전체 컨트롤러 코드를 입력하십시오. –
이렇게하는 것이 좋습니다. 이와 같은 일들은 나중에 다른 시간에 디버깅하기 힘든 rly가 될 당신을 이끌 수 있습니다. db에서 열을 수정하여 부동 소수점을 저장하고 마이 그 레이션을 실행하면 정수가 수레로 변경됩니다. – Avdept