4

deviseを使用して登録にロジックを追加しようとしています。私は2つのサインアップフォームを持っています。1つはhabtm関係を介して接続されている別のオブジェクトの追加フィールドを持っています。devise登録コントローラーを拡張し、存在する場合は新しいオブジェクトを作成しましたが、このメソッドで新しく作成されたユーザーを取得する方法がわかりません。

私のカスタムregistrations_controller.rbで:

class RegistrationsController < Devise::RegistrationsController
  def create
    unless params[:business].nil?
      @business = Business.new(params[:business])
    end
    super
    #@user.businesses << @business  #how can I implement something like this?
  end

end
4

2 に答える 2

2

私は前にこれに非常によく似たことをしました。この質問をチェックしてください fields_for ブロックを条件付きにする

これには 2 つの方法があります。1 つは迅速で汚いもので、もう 1 つはレールを最大限に活用します。

方法 1

最初にモデルで、accepts_nested_attributes_for :businesses次にコントローラーで次のようなものがあることを確認してください

params[:user][:businesses] = [ params[:business] ]

方法 2

代わりにやりたいことの 1 つは、モデルを有利に使用することです。ビューでfields_forブロックを使用すると、モデルのセットアップ方法から推測できるリレーションを指定できます。

それでもaccepts_nested_attributes_for :businesses、モデルにあることを確認してください

コントローラーで、いくつかの変更を加える必要があります。

def new
  resource = build_resource({})
  resource.businesses.build  # Inserts a blank object for business
  respond_with resource
end

追加したコードのビットを削除できるため、作成アクションでは何も触れないでください。

ビューでは、ビジネス フォームと登録フォームが表示されます。のようなものを追加します。

<% form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
  # some user form stuff
  <%= f.fields_for :business do |i| %>
    <%= render "/users/registrations/business", :form => i %>
  <% end %>
<% end %>

保存時に、コントローラーは、ビジネスをユーザーに自動的に追加していることを認識する必要があります。

実際の書式設定と命名をいじる必要があるかもしれませんが、Rails でフォームを送信すると、操作が非常に簡単になります。また、コントローラーを美しく薄く保つというイデオロギーにも対応しています。

于 2013-02-01T16:47:59.780 に答える
1

新しく作成されたUserオブジェクトは variable として使用できますresource

だから、resource.businesses << @businessうまくいくでしょう。

于 2015-12-20T12:00:42.457 に答える