i'm having hard time trying understand how permit non model parameters.
i've read:
- rails strong parameters: how accept both model , non-model attributes?
- rails 4 strong parameters : permit attributes?
- strong parameters
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
Post a Comment