我很难试图了解如何允许非模型参数。RoR允许非模型参数
我读过:
- Rails Strong Parameters: How to accept both model and non-model attributes?
- Rails 4 Strong parameters : permit all attributes?
- Strong Parameters
所以,对于一个 “正常” 的情况 - 让我们说,我有一个具有只是一个模型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_1
和bar_2
参数?如果我这样做,我该如何准许他们?
在第一个选项,如果我不使用'foo_params'为创建/更新,然后方法真正需要的? – Vucko
是的。你会继续做'Foo.new(foo_params)'。 – lcguida
想我明白了。干杯 – Vucko