0

アプリで新しいユーザーが作成されたときに、すべてが既に設定されているようにしようとしています。たとえば、メモを保存するフォルダがあります。したがって、新しいフォルダへのリンクをクリックしてから送信ボタンをクリックしてメモを保存するのではなく、メモを保存する前に、ユーザーアカウントの作成時に自動的に設定することはできますか?

例えば

users_controller.rb:

def create
    @user.password = params[:password]
    respond_to do |format|
      if @user.save
         @folder = @user.folder.new(params[:folder]) # this is the line that I'm unsure how to implement

        format.html { redirect_to @user, notice: 'User was successfully created.' }
        format.json { render json: @user, status: :created, location: @user }
      else
        format.html { render action: "new" }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

解決:

Deviseを使用しているときに、ユーザーコントローラーに追加していたルーティングが上書きされていたため、解決策(おそらくこれを行うためのより良い方法があります!)は、登録コントローラーのafter_user_sign_up_pathにコードを追加することでした。 。

4

1 に答える 1

0

@userアクションでは、との両方のパラメータを使用します@user.folder

ネストされた属性を使用することをお勧めします。

class User
  has_one :folder
  accepts_nested_attributes_for :folder
end

次に、次のようにアクションを記述できます。

def create
  @user.update_attributes(params[:user])
  respond_to do |format|
    if @user.save
      # Here the folder is already saved!

      format.html { redirect_to @user, notice: 'User was successfully created.' }
      format.json { render json: @user, status: :created, location: @user }
    else
      format.html { render action: "new" }
      format.json { render json: @user.errors, status: :unprocessable_entity }
    end
  end
end

には多くの利点があるはずです(私はそれらすべてをチェックしていませんが)、それらの中で:

  • フォルダなしで保存するリスクを冒さ@userないでください(フォルダの保存が失敗した場合、ユーザーの保存は失敗します)
  • @ user.errorsには、との両方の検証エラーが含まれている必要があり@userます@user.folder

ただし、これを行うには、paramsに別の構造を設定する必要があります(fields_forを使用すると簡単に実現できます)。

user:
  password: "Any password"
  folder_attributes:
    any_attribute: "Any value"
于 2013-03-07T14:43:55.430 に答える