Ruby on rails rails中的多态嵌套表单保存

Ruby on rails rails中的多态嵌套表单保存,ruby-on-rails,forms,associations,polymorphism,Ruby On Rails,Forms,Associations,Polymorphism,用户可以创建不同类型的帖子。我建立了一个多态关系 职位 邻里邮政表格 = f.fields_for :post do |post_builder| .control-group = post_builder.label :address, 'Adres', class: 'control-label' .controls = post_builder.text_field :address, placeholder: "Adres voor locatie" 这

用户可以创建不同类型的帖子。我建立了一个多态关系

职位

邻里邮政表格

= f.fields_for :post do |post_builder|
  .control-group
    = post_builder.label :address, 'Adres', class: 'control-label'
    .controls
      = post_builder.text_field :address, placeholder: "Adres voor locatie"
这确实有效。但是,我不喜欢在创建操作中编辑参数。当我尝试执行以下操作时:

@neighborhood_post = current_user.neighborhood_posts.create(params[:neighborhood_post])

…它实际上创建了两个帖子。其中一个设置了用户id,其中地址为零;另一个设置了用户id,并且地址中填充了数据。怎么会这样

当您构建
帖子时,我假设您会这样做:

@neighborhood_post = NeighborhoodPost.new
@neighborhood_post.build_post
你只需要再往前走一点:

@neighborhood_post.build_post( user_id: current_user.id )
然后以您的形式:

= f.fields_for :post do |post_builder|
  = post_builder.hidden_field :user_id
此方法的缺点是,您必须-ahem-信任用户输入,或者以某种方式验证post是否具有有效的用户id(=当前用户id)。因此,如果您不想信任用户输入,我想另一种方法是:

class NeigborhoodPost < ActiveRecord::Base

  def self.new_from_user( user, params = {}, options = {}, &block )
    new( params, options, &block ).tap do |new_post|
      new_post.post.user_id = user.id if new_post.post.present?
    end
  end

end
另一个选项是反转过程:
Post
接受:postable
的嵌套属性,您将使用
当前用户.posts.new(参数[:Post])
创建Post。YMMV

@neighborhood_post.build_post( user_id: current_user.id )
= f.fields_for :post do |post_builder|
  = post_builder.hidden_field :user_id
class NeigborhoodPost < ActiveRecord::Base

  def self.new_from_user( user, params = {}, options = {}, &block )
    new( params, options, &block ).tap do |new_post|
      new_post.post.user_id = user.id if new_post.post.present?
    end
  end

end
@neighborhood_post = NeighborhoodPost.new_from_user( user, params[:neighboorhood_post] )