2012-03-08 30 views
0

私はRailsの新機能ですから、ここではわかりませんが、ここでは起こっていることがあります。ビルドを呼び出すと、ネストされたRailsのネストされた属性が削除される

私はUserモデル(Deviseを搭載)を持っており、各ユーザーにはそれぞれの写真属性があります。私は写真をユーザーの一部として含めることができたことは知っていますが、写真は実際にはサイトの中核的な内容なので、私はそれらを自分のテーブルにすることを好みました。写真モデルには、実際の写真ファイルを扱うクリップクリップが付属しています。

問題は次のとおりです。写真をユーザーとしてアップロードするとすべてが計画どおりに機能しますが、何らかの理由で写真のアップロードページに戻ると、アップロードした写真が削除されます。私はので、@ user.photoアップロードするためのフォームがnilクラスのエラーをスローし、その呼び出していない場合は

@photo = @

user.build_photo:私はこのコード行にそれを突き止めました存在しませんが、私がそれを呼び出すと、私が知る限り、ビルドではなくデータベースを変更するcreate関数なので、以前にアップロードされた写真が削除されます。ここで

は、サーバーが示して何:

は(HTMLのユーザー負荷としてSettingsController#インデックスで2012-03-08 10時19分21秒-0800 処理で127.0.0.1のための "/設定を" GET開始しました0.3ms) SELECT users。* FROM users WHERE usersid = 6リミット1写真 負荷(0.3ms)SELECT photos。* FROM photos WHERE photosuser_id = 6 LIMIT 1(0.2ms)BEGIN [paperclip]添付ファイルの削除をスケジュールします。 SQL(0.6ms)から削除photos WHERE photosid = 20 [paperclip]添付ファイルを削除しています。

そして、ここで私のモデルとコントローラのカップルです:

class SettingsController < ApplicationController 
    def index 
     @user = current_user 
     @photo = @user.build_photo 
    end 
end 

<h1>Settings Page</h2> 
<%= image_tag @user.photo.the_photo.url(:medium) %> 
<%= form_for [@user, @photo], :html => { :multipart => true } do |f| %> 
    <%= f.file_field :the_photo %> 
    <%= f.submit %> 
<% end %> 


class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    # Setup accessible (or protected) attributes for your model 
    attr_accessible :email, :password, :password_confirmation, :remember_me, :name, :photo_attribute 

    has_one :photo, :dependent => :destroy 
    accepts_nested_attributes_for :photo 
end 

class PhotosController < ApplicationController 
    def create 
     @user = current_user 
     @photo = @user.create_photo(params[:photo]) 
     redirect_to root_path 
    end 

    def update 
     @user = current_user 
     @photo = @user.photo 
     if @photo.update_attributes(params[:photo]) 
      redirect_to settings_path 
     else 
      redirect_to settings_path 
     end 
    end 

    def destroy 
    end 
end 

答えて

1

あなたが発見してきたように、1がすでに存在している場合@user.build_photoはそのuserためphotoを削除します呼び出します。その場合には、をスキップするだけです。

@photo = @user.photo || @user.build_photo 
+0

天才、ありがとう! –

関連する問題