簡體   English   中英

Rails 4,如何從表單中的字符串字段創建新的模型實例?

[英]Rails 4, How do I create a new model instance from a string field in a form?

在Rails 4中執行以下操作的正確方法是什么? 我有一個為特定模型輸入字符串和其他一些參數的表單,比方說Foo。 該模型與另一個模型有關聯,

class Foo < ActiveRecord::Base
  belongs_to :bar
end

我想根據給定的字符串創建一個新的Bar,假設該名稱的Bar在數據庫中尚不存在。

我最初的方法是在控制器級別執行此操作,本質上是從params中獲取名稱,然后嘗試從中創建一個對象並將原始params變異為包括新對象而不是原始字符串。 但是我意識到這不是很慣用的Rails,我應該完全在模型級別執行此操作。

那么我將如何在模型級別完成我想做的事情? 我在想我需要一個過渡屬性和某種before_validation過濾器,但是我對Rails不太熟悉。 有任何想法嗎?

不確定是否正確理解您要做什么,但您可能需要看一下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"

為什么需要變異參數? 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM