2016-08-01 52 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_pa​​rams方法:

# 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

在第一個選項,如果我不使用'foo_params'爲創建/更新,然後方法真正需要的? – 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 consoleUnpermitted parameters: bar_1, bar_2

1

除非您在foo下創建它們,否則不需要允許bar_1和bar_2參數。但在你的情況下,你正在富有創造。最好的解決辦法是創建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