如何为has_one关联创建视图?

Geo*_*Geo 6 activerecord ruby-on-rails

所以,想象一下我有这个模型:

class Car
  has_one :engine
end
Run Code Online (Sandbox Code Playgroud)

和发动机型号:

class Engine
  belongs_to :car
end
Run Code Online (Sandbox Code Playgroud)

当我为用户呈现表单时,他可以创建一个新车,我只想让他从一个可用的引擎中选择(可用的引擎将在a中select,由人填充collection_select).问题是,如果我像这样构建字段:

<%= f.collection_select :engine,Engine.all,:id,:name %>
Run Code Online (Sandbox Code Playgroud)

当我尝试保存它时,我会得到一个AssociationTypeMismatch说它期望一个引擎,但它收到了一个字符串.

这是这样做的吗?

def create
  car = Car.new(params[:car])
  engine = Engine.find(params[:engine])
  car.engine = engine
  if car.save
     # redirect somewhere
  else
     # do something with the errors
  end
end
Run Code Online (Sandbox Code Playgroud)

我一直认为,将引擎与汽车相关联的东西是由Rails自动完成的,但我不知道如何让他这样做.

切换has_onebelongs_to关联是实现这一目标的唯一方法吗?

我迷路了,我觉得我在这里缺少一些非常基本的东西.

fl0*_*00r 9

你应该用 engine_id

<%= f.collection_select :engine_id, Engine.all, :id, :name %>
Run Code Online (Sandbox Code Playgroud)

UPD

至于Engine不是belongs_to Car所以你应该在这里使用嵌套属性.这个截屏视频对您非常有用:

Checkout api:http://apidock.com/rails/ActiveRecord/NestedAttributes/ClassMethods/accepts_nested_attributes_for

简介:

class Car
  has_one :engine
  accepts_nested_attributes_for :engine
end
Run Code Online (Sandbox Code Playgroud)

并以您的形式:

<%= form_for @car ... do |f| %>
  ...
  <%= f.fields_for :engine do |b| %>
    <%= b.collection_select :id, Engine.all, :id, :name %>
    ...
  <% end %>
  ...
<% end %>
Run Code Online (Sandbox Code Playgroud)

  • 字段for正在寻找存在的引擎,所以如果你没有得到任何@car - 什么都不会出现,你应该初始化它.比如`f.fields_for:engine,@ car.build_ingine do | f | ...` (2认同)