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_one和belongs_to关联是实现这一目标的唯一方法吗?
我迷路了,我觉得我在这里缺少一些非常基本的东西.
你应该用 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)
| 归档时间: |
|
| 查看次数: |
4675 次 |
| 最近记录: |