有没有办法在 rails 4 的一个 form_for 中拥有多个不同的模型?
也许像
# gives error
<%= form_for ([@user, @pet]), url: some_path do |u, p| %>
有没有办法在 rails 4 的一个 form_for 中拥有多个不同的模型?
也许像
# gives error
<%= form_for ([@user, @pet]), url: some_path do |u, p| %>
通常这样的事情是通过两个模型的关联来完成的。在这种情况下,我将在这里做一些假设。我假设您有两个模型user
和pet
. 我假设 apet
属于 auser
并且 auser
可以有很多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
路线
您可能需要考虑的一件事就是将它们设置为类似于此。这将使您的路线更漂亮一些,因为宠物表演动作也会被用户引用/users/:user_id/pets/:pet_id
resources :users do
resources :pets
end
使用助手是不可能的,form_for
因为它只需要一条记录。语法 with[@user, @pet]
用于为关联记录构建正确的路径。只有传递数组的最后一个元素将用作记录。其他将用于创建正确的路线。因此,在您的示例中,假设用户有一只或多只宠物并且@user
被持久化,结果路线将如下所示之一:
"user/#{@user[:id]}/pet/#{@pet[:id]}" # when @pet is persisted
"user/#{@user[:id]}/pet/new" # if @pet = Pet.new
您可以定义自己的助手和表单构建器,或者只编写自定义模板视图来接受多个记录。