用于多个不同类对象的Rails form_?

时间:2013-10-05 00:00:36

标签: ruby-on-rails ruby ruby-on-rails-4

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

可能像

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

2 个答案:

答案 0 :(得分:3)

通常这样的事情是通过两个模型的关联来完成的。在这种情况下,我将在这里做一些假设。我假设您有两个模型userpet。我假设pet属于useruser可以有多个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

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