2016-08-01 3 views
2

비 모델 매개 변수 허용 방법을 이해하는 데 어려움을 겪고 있습니다.RoR 비 모델 매개 변수 허용

내가 읽은 :

그래서, "정상적인"상황 -의 난 그냥이 모델 Foo을 가정 해 봅시다 하나의 속성 bar :

# foo.rb 
class Foo < ActiveRecord::Base 
    # bar, which is a integer 
end 

# views/foos/new.html.erb 
<%= form_for @foo do |f| %> 
    <%= f.number_field :bar %> 
    <%= f.submit %> 
<% end %> 

#foos_controller.rb 
def create 
    @foo = Foo.new(foo_params) 
    # ... 
end 

#... 

private 

def foo_params 
    params.require(:foo).permit(:bar) 
end 

양식을 제출하면 Foo이 생성됩니다.


그러나, bar 속성이 뒤에 어떤 논리가 어떤 경우 일부 비 모델 매개 변수를 결합한? bar이 두 개의 매개 변수 (bar = bar_1 + bar_2)의 합계라고 가정 해 보겠습니다. 그런 다음 뷰와 컨트롤러는 다음과 같습니다

# views/foos/new.html.erb 
<%= form_for @foo do |f| %> 
    <%= f.number_field :bar_1 %> 
    <%= f.number_field :bar_2 %> 
    <%= f.submit %> 
<% end %> 

#foos_controller.rb 
def create 
    bar_1 = params[:foo][:bar_1] 
    bar_2 = params[:foo][:bar_2] 

    if bar_1.present? && bar_2.present? 
    @foo = Foo.new 
    @foo.bar = bar_1.to_i + bar_2.to_i 

    if @foo.save 
     # redirect with success message 
    else 
     # render :new 
    end 
    else 
    # not present 
    end 
end 

그래서 질문은, 나는 또한 bar_1bar_2 매개 변수를 허용해야합니까입니까? 내가 그렇게한다면, 어떻게 그들을 허용합니까? 당신이 그 않는 두 모델 매개 변수에 액세스하려면

답변

1

첫 번째 옵션을 만드는 것입니다 :

허가 bar1bar2 :

def foo_params 
    params.require(:foo).permit(:bar1, :bar2) 
end 

그런 다음 모델에서이 논리를 처리이 모델의 논리를 넣어 :

class Foo < ActiveRecord::Base 
    attr_accessor :bar1, bar2 

    after_initialize :set_bar 

    def set_bar 
    self.bar = bar1 + bar2 if bar_1 && bar_2 
    end 
end 

두 번째 옵션 :이 formatted_params 방법 작성 : 내가 생성/업데이트 'foo_params`를 사용하지 않는 경우, 첫 번째 옵션에서

# views/foos/new.html.erb 
<%= form_for @foo do |f| %> 
    <%= f.number_field :bar_1 %> 
    <%= f.number_field :bar_2 %> 
    <%= f.submit %> 
<% end %> 

#foos_controller.rb 
def create 
    @foo = Foo.new(formatted_params) 

    if @foo.save 
     # redirect with success message 
    else 
     # render :new 
    end 
end 

def permitted_params 
    params.require(:foo).permit(:bar_1, :bar2) 
end 

def formatted_params 
    bar1 = permitted_params.delete(:bar1) 
    bar2 = permitted_params.delete(:bar2) 
    permitted_params.merge(bar: bar1 + bar2) 
end 
+0

는 방법은 다음 정말 필요하지? – Vucko

+0

예. 'Foo.new (foo_params)'를 계속 수행 할 것입니다. – lcguida

+0

내가 가지고 있다고 생각해.건배 – Vucko

3

, 당신은 당신의 Foo 모델

attr_accessor :bar_1, :bar_2 

을에 허용 할 필요가 없습니다에 아래의 코드 모델과 바인딩해야

def foo_params 
    params.require(:foo).permit(:bar) 
end 

참고 : params에서 오류를 제거했는지 확인하십시오. 오류는 발생하지 않지만 rails console에 대한 경고는 Unpermitted parameters: bar_1, bar_2

1
과 같이 표시됩니다.

bar_1 및 bar_2 매개 변수를 foo에서 만들지 않으면 허용 할 필요가 없습니다. 그러나 당신의 경우에 당신은 foo에서 창조하고 있습니다. 가장 좋은 방법은 attr_accessor

# foo.rb 
class Foo < ActiveRecord::Base 
    # bar, which is a integer 
    attr_accessor :bar_1, bar_2 
end 

# views/foos/new.html.erb 
<%= form_for @foo do |f| %> 
    <%= f.number_field :bar_1 %> 
    <%= f.number_field :bar_2 %> 
    <%= f.submit %> 
<% end %> 

#foos_controller.rb 
def create 
    bar_1 = params[:foo][:bar_1] 
    bar_2 = params[:foo][:bar_2] 

    if bar_1.present? && bar_2.present? 
    @foo = Foo.new 
    @foo.bar = bar_1.to_i + bar_2.to_i 

    if @foo.save 
     # redirect with success message 
    else 
     # render :new 
    end 
    else 
    # not present 
    end 
end