ruby on rails - RoR permitting non model parameter -


i'm having hard time trying understand how permit non model parameters.

i've read:

so, "normal" situation - let's have model foo has 1 attribute bar:

# foo.rb class foo < activerecord::base   # bar, integer end  # views/foos/new.html.erb <%= form_for @foo |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 

so, when submit form, foo created.


however, if bar attribute has logic behind combines non model parameters? let's bar sum of 2 parameters (bar = bar_1 + bar_2). view , controller looks like:

# views/foos/new.html.erb <%= form_for @foo |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 success message     else       # render :new     end   else     # not present   end end 

so question is, need permit bar_1 , bar_2 parameters? if do, how permit them?

first option: put logic in model:

permit bar1 , bar2:

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

then handle logic in model:

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 

second option: create formatted_params method:

# views/foos/new.html.erb <%= form_for @foo |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 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 

Comments