0

各投稿が多くの場所に属しているネストされたフォームがあります。ネストされたフォームを使用して投稿に場所を追加することは問題なく機能します。ただし、「編集」をクリックして場所以外を変更すると、cannot call create unless the parent is savedエラーが発生します。

これは、送信されたものを実行して一意性をチェックするモデルのコードの一部に関係していると思いますが、location_attributesこれを修正する方法がわかりません。@post.save!コントローラーで行う直前に試しfind_or_initialize_by_nameましたが、同じエラーが発生します。

コードは以下です。私はこれが私にとってかなりユニークであることを知っていますが、どんな提案も素晴らしいでしょう!

posts_controller.rb

...
def update
   location_set = params[:post].delete(:locations_attributes) unless params[:post][:locations_attributes].blank?
  @post = Post.find(params[:id])
  @post.locations = Location.find_or_initialize_location_set(location_set) unless location_set.nil?

  if @post.update_attributes(params[:post])
    redirect_to @post, notice: 'Blog post was successfully updated.'
  else
    render action: "edit"
  end
end
...

location.rb (モデル) include PublicActivity::Model 追跡された追跡された所有者: Proc.new{ |コントローラー、モデル| コントローラー。現在のユーザー}

include FriendlyId
friendly_id :name

after_save { |location| location.destroy if location.name.blank? }
after_save { |venue| venue.destroy if venue.name.blank? }


has_many :location_post, :order => "position"
has_many :posts, :through => :location_post, :order => 'location_posts.position'


attr_accessible :latitude, :longitude, :name, :post_id, :notes, :asset, :assets_attributes, :venues_attributes
attr_accessor :_destroy, :position, :location_post_id


def self.find_or_initialize_location_set(location_set)
  #create a locations array
  locations = []

  locations = locations.delete_if { |elem| elem.flatten.empty? }
  location_set.each do |key, location|
    if location.delete(:_destroy) == "1"
      locations.delete_if {|elem| elem[:name] == location[:name]}
    else
  locations << find_or_initialize_by_name(location)  
  #REMINDER In rails 4 this must be written as where(...).first_or_create
    end
end
locations
end

*編集 - エラー *

app/models/location.rb:10:in `block in <class:Location>'
app/controllers/blogit/posts_controller.rb:97:in `update'
4

1 に答える 1

1

これは愚かな間違いによって引き起こされました。

after_save { |venue| venue.destroy if venue.name.blank? }はもはや関係ありません。

私はばかで、エラーを正しく読みませんでした。助けてくれたすべての人に感謝します。

于 2013-02-03T15:14:02.600 に答える