0

次の new および create アクションがあります。これらは、マルチテナント アプリで新しいアカウントを作成するために使用されます。それは正常に動作しますが、初心者であっても、これが正しくないことはわかっています。これが私の質問です。作成アクションをより薄くして、ベストプラクティスに従うにはどうすればよいですか? また、すべてのクエリが 1 つのトランザクションで送信されるようにするにはどうすればよいですか?

ここに私の方法があります:

  def new
    @account = Account.new
    @user = @account.users.build()
    @account.accounts_users.build()
    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @account }
    end
  end



  def create
    @account = Account.new(params[:account])
    respond_to do |format|
      if @account.save
         @user = User.find_by_email(params[:account][:users_attributes]["0"][:email])
        Profile.create(:user_id => @user.id)
        @group = @account.groups.create(:name => 'Default', :user_id => @user)
        @group.members.create(:account_id => @account, :user_id => @user)
        Role.all.each do |role|
          @user.roles_users.create(:role_id => role.id, :account_id => @account)
        end

        flash[:domain] = @account.subdomain
        format.html { redirect_to thanks_url }
        format.json { render json: @account, status: :created, location: @account }
      else
        format.html { render action: "new" }
        format.json { render json: @account.errors, status: :unprocessable_entity }
      end
    end
  end

私のモデルは次のとおりです。

  • アカウント (has_many :users; :account_users 経由)
  • ユーザー (has_one :profile)
  • Accounts_User (belongs_to :アカウント、belongs_to :user)
  • グループ (has_many :members、as: メンバーシップ、belongs_to :user)
  • メンバー (belongs_to :membership, :polymorphic => true)
  • プロフィール (belongs_to :user)
  • 役割 (has_many :roles_users; has_many :users :through => :roles_users; has_many :accounts, :through => :roles_users)
  • RolesUser (belongs_to :user; belongs_to :account; belongs_to :role)
4

1 に答える 1

0

私の意見では、コントローラー内のすべてのステートメントをcreateトランザクション ブロックにグループ化することをお勧めします。詳細については、 ActiveRecord トランザクションのドキュメントを参照してください。例はRails 3 ActiveRecord Transactionsにあります。

于 2012-07-31T13:06:06.673 に答える