有没有办法在rails 4中的一个form_for中拥有多个不同的模型?
可能像
# gives error
<%= form_for ([@user, @pet]), url: some_path do |u, p| %>
答案 0 :(得分:3)
通常这样的事情是通过两个模型的关联来完成的。在这种情况下,我将在这里做一些假设。我假设您有两个模型user
和pet
。我假设pet
属于user
而user
可以有多个pets
。通过这种关联,pet
模型将具有user_id
属性,该属性将用户与该宠物相关联。
用户模型
attr_accessible :name, :pets_attributes
has_many :pets
accepts_nested_attributes_for :pets
宠物模型
attr_accesible :user_id, :name
belongs_to :user
就个人而言,我非常喜欢使用simple_form
因为它具有很酷的关联功能。
查看强>
<% simple_form_for @user do |f| %>
<%= f.input :name %>
<%= f.simple_fields_for :pets do |p| %>
<% p.input :name %>
<% end %>
<% end %>
<强>控制器强>
在你的控制器中,(假设这是一个new
动作)。这将为用户创建一条线,并为宠物建立三个位置。
def new
@user = User.new
3.times do
@user.pets.build
end
end
<强>路线强>
您可能想要考虑路线的一件事是将它们设置为类似于此。这会使您的路线变得更漂亮,因为Pet show动作也会引用给用户/users/:user_id/pets/:pet_id
resources :users do
resources :pets
end
答案 1 :(得分:1)
使用form_for
助手是不可能的,因为它只需要一条记录。 [@user, @pet]
的语法用于构建关联记录的正确路由。只有传递数组的最后一个元素才会被用作记录。其他将用于创建正确的路线。因此,在您的示例中,假设用户有一个或多个宠物并且@user
持久存在,结果路由将类似于以下之一:
"user/#{@user[:id]}/pet/#{@pet[:id]}" # when @pet is persisted
"user/#{@user[:id]}/pet/new" # if @pet = Pet.new
您可以定义自己的帮助器和表单构建器,或者只编写自定义模板视图以接受多个记录。