0

Rails 4で次のことを行う正しい方法は何ですか? 特定のモデルの文字列とその他のパラメーターを受け取るフォームがあります。たとえば、Foo としましょう。このモデルには別のモデルへの関連付けがあり、

class Foo < ActiveRecord::Base
  belongs_to :bar
end

その名前のバーがまだデータベースに存在しないと仮定して、指定された文字列から新しいバーを作成したいと思います。

私の最初のアプローチは、コントローラー レベルでこれを行うことでした。基本的にパラメーターから名前を取得し、そこからオブジェクトを作成し、元のパラメーターを変更して、元の文字列ではなく新しいオブジェクトを含めようとしました。しかし、それはあまり慣用的な Rails ではなく、代わりにモデル レベルでこれを完全に行うべきであることに気付きました。

では、モデル レベルでやりたいことをどのように達成すればよいでしょうか。私は一時的な属性と何らかのbefore_validationフィルターが必要だと考えていますが、Rails にはあまり詳しくありません。何か案は?

4

2 に答える 2

1

あなたが何をしようとしているのかを正しく理解することはできませんが、レールのネストされた属性を見たいと思うかもしれません。

次のような 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 に答える