0

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

class Foo < ActiveRecord::Base
  belongs_to :bar
end

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

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

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

4

2 回答 2

1

不确定是否正确理解您要做什么,但您可能想看看rails 嵌套属性

您将有一个 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"
于 2013-10-28T22:18:06.377 回答
0

为什么需要改变参数?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
于 2013-10-28T22:16:21.620 回答