2

有没有办法在 rails 4 的一个 form_for 中拥有多个不同的模型?

也许像

# gives error
<%= form_for ([@user, @pet]), url: some_path do |u, p| %>
4

2 回答 2

3

通常这样的事情是通过两个模型的关联来完成的。在这种情况下,我将在这里做一些假设。我假设您有两个模型userpet. 我假设 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
于 2013-10-05T01:18:09.753 回答
1

使用助手是不可能的,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

您可以定义自己的助手和表单构建器,或者只编写自定义模板视图来接受多个记录。

于 2013-10-05T01:16:08.080 回答