以新形式添加来自不同模型的输入

时间:2014-09-09 10:25:11

标签: ruby-on-rails simple-form

我与照片赞助商有很多关系。

创建新照片时,在new.html.erb视图中,我想添加赞助商属性(属于不同的模型,但与照片有关),但我不知道怎么做。

我想在照片创建视图中添加:sponsor_name,:sponsor_web 输入,因此我可以在创建新照片时添加照片所拥有的赞助商信息

我尝试在同一个视图中创建2个simple_forms,一个带有照片表属性,另一个带有赞助商属性,但没有用。

Mi view(new.html.erb)

<%= simple_form_for [current_user, @photo] do |f| %>
                    <%= f.button :submit, "Subir Spot"%>
            <% end %>

我的照片#new Controller

def new
    @photo = Photo.new
    @sponsor = @photo.sponsors
end

1 个答案:

答案 0 :(得分:2)

<强>嵌套

您希望在Photo模型中使用accepts_nested_attributes_for

#app/models/photo.rb
class Photo < ActiveRecord::Base
   has_many :sponsors
   accepts_nested_attributes_for :sponsors
end

这使您能够使用nested form

#app/controllers/photos_controller.rb
class PhotosController < ApplicationController
   def new
       @photo = Photo.new
       @photo.sponsors.build
   end

   def create
       @photo = Photo.new photo_params
       @photo.save
   end

   private

   def photo_params
      params.require(:photo).permit(:photo, :params, sponsors_attributes: [:name, :web])
   end
end

#app/views/photos/new.html.erb
<%= form_for @photo do |f| %>
   # Photo attributes here
   <%= f.fields_for :sponsors do |s| %>
      <%= s.text_field :name %>
      <%= s.text_field :web %>
   <% end %>
   <%= f.submit %>
<% end %>

当您创建新的Sponsor对象时,这将用于创建新的Photo对象,从而使您能够传递嵌套的数据。

-

虽然这适用于has_many :through关联,但在将has_and_belongs_to_many[other]_ids一起使用时,您会要小心,就好像您只想关联两个模型一样,您将会这样做更好地填充新Photo对象

的{{1}}方法

如果您想了解更多信息,我可以详细说明