首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RoR允许非模型参数

RoR允许非模型参数
EN

Stack Overflow用户
提问于 2016-08-01 12:49:39
回答 3查看 3.3K关注 0票数 5

我很难理解如何允许非模型参数。

我读过:

因此,对于“正常”情况--假设我有一个模型Foo,它只有一个属性bar

代码语言:javascript
复制
# 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)的之和。然后视图和控制器看起来如下:

代码语言:javascript
复制
# 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参数吗?如果我这样做了,我如何允许他们?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-01 13:04:34

第一个选项:将逻辑放在模型中:

允许bar1bar2

代码语言:javascript
复制
def foo_params
  params.require(:foo).permit(:bar1, :bar2)
end

然后在模型中处理这个逻辑:

代码语言:javascript
复制
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方法:

代码语言:javascript
复制
# 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
票数 2
EN

Stack Overflow用户

发布于 2016-08-01 13:00:52

如果要访问这两个非模型参数,则必须通过Foo模型上的以下代码将其与模型绑定。

代码语言:javascript
复制
attr_accessor :bar_1, :bar_2

不需要允许它进入

代码语言:javascript
复制
def foo_params
   params.require(:foo).permit(:bar)
end

注意:请确保将其从params中删除,它不会引发任何错误,但在rails console (如Unpermitted parameters: bar_1, bar_2 )上给您一个警告

票数 4
EN

Stack Overflow用户

发布于 2016-08-01 13:01:34

除非在foo下创建bar_1和bar_2参数,否则不需要允许它们。但是在您的例子中,您正在创建下面的foo。最好的解决方案是创建attr_accessor

代码语言:javascript
复制
# 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38699372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档