Rails 4,如何从表单中的字符串字段创建新的模型实例?

时间:2013-10-28 21:57:23

标签: ruby-on-rails ruby-on-rails-4 rails-models

在Rails 4中执行以下操作的正确方法是什么?我有一个表单,它接受一个特定模型的字符串和一些其他参数,让我们说Foo。该模型与另一个模型有关联,

class Foo < ActiveRecord::Base
  belongs_to :bar
end

我想从给定的字符串创建一个新的Bar,假设数据库中不存在具有该名称的Bar。

我最初的方法是在控制器级别执行此操作,基本上从params中获取名称,然后尝试从中创建一个对象并改变原始params以包含新对象而不是原始字符串。但我意识到这不是非常惯用的Rails,而是我应该完全在模型级别这样做。

那么我如何在模型级别完成我想做的事情呢?我想我需要一个瞬态属性和某种before_validation过滤器,但我对Rails不是很熟悉。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

不确定是否正确理解您要做什么,但您可能需要查看rails nested attributes

你会有如下的Foo类:

class Foo < ActiveRecord::Base
  has_one :bar

  accepts_nested_attributes_for :bar
end

class Bar < ActiveRecord::Base
  belongs_to :foo
end

您可以创建一个与Foo直接关联的新Bar实例,如下所示:

foo = Foo.new(bar_attributes: { name: "Bar's name" })
foo.bar.name
#=> "Bar's name"

答案 1 :(得分:0)

为什么你需要改变params? IMO应该在控制器级别完成,但根本不更改任何参数。

class FoosController

  before_filter :set_foo
  before_filter :set bar

  def update
    @foo.bar = @bar
    @foo.update(foo_params)
    respond_with @foo
  end

  private 

    def set_foo
      @foo = Foo.find(params[:id])
    end

    def set_bar
      @bar = # create/find your Bar from the params here
    end

    def foo_params
      params.require(:foo).permit(...)
    end

end