多模型嵌套表单,无法将用户添加到当前帐户

时间:2012-06-29 17:14:37

标签: ruby-on-rails nested-forms multi-tenant

我到处寻找解决方案,但没有提出任何解决方案。

有效的部分:我的应用允许客户使用嵌套表单创建帐户。收集的数据在四个模型中创建记录 - 帐户,用户,accounts_users(因为用户可以与许多帐户关联)和配置文件(用于存储用户的fname,lname,phone等)。

无效的部分:登录后,我希望用户能够使用下面的表单向其帐户添加更多用户。我在提交时没有收到任何错误,但我被带回到同一表格,没有创建额外的记录。任何帮助都会很棒!

这是嵌套表格......

<%= form_for @user, :validate => true do |f| %>
<fieldset>
    <%= f.fields_for :profile do |p| %>
    <div class="field">
      <%= p.label :first_name %>
      <%= p.text_field :first_name %>
    </div>
    <div class="field">
      <%= p.label :last_name %>
      <%= p.text_field :last_name %>
    </div>
    <div class="field">
      <%= p.label :phone %>
      <%= p.text_field :phone %>
    </div>
    <% end %>
    <div class="field">
        <%= f.label :email %>
        <%= f.text_field :email %>
    </div>
    <div class="actions">
        <%= f.submit 'Create New User', :class => "btn btn-large btn-success" %>
        <%= cancel %>   
    </div>
</fieldset>

ApplicationController将所有内容范围都限定为current_account,如下所示:

def current_account
  @current_account ||= Account.find_by_subdomain(request.subdomain) if request.subdomain
end

UsersController

def new
  @user = User.new  
  @user.build_profile()
  #current_account.accounts_users.build()  #Edit2: This line was removed

  respond_to do |format|
  format.html # new.html.erb
  format.json { render json: @user }
end

def create
  @user = User.new(params[:user])
  @user.accounts_users.build(:account_id => current_account.id) #Edit2: This line was added
  if @user.save
    # Send Email and show 'success' message
    flash[:success] = 'An email has been sent to the user'
  else
    # Render form again
    render 'new'
  end
end

模型看起来像这样:

class Account < ActiveRecord::Base
  attr_accessible :name, :subdomain, :users_attributes
  has_many :accounts_users
  has_many :users, :through => :accounts_users
  accepts_nested_attributes_for :users
end

class User < ActiveRecord::Base
  attr_accessible :email, :password, :password_confirmation, :profile_attributes
  has_many :accounts_users
  has_many :accounts, :through => :accounts_users
  has_one :profile
  accepts_nested_attributes_for :profile
end

class AccountsUser < ActiveRecord::Base
  belongs_to :account
  belongs_to :user
end

class Profile < ActiveRecord::Base
  belongs_to :user
  attr_accessible :first_name, :last_name, :phone
end

Edit2:事实证明我在User模型中需要密码+ password_comfirmation验证,这使我无法添加没有这些字段的其他用户。我注释掉了这些验证并删除了“new”操作中的行:current_account.accounts_users.build(),并在“create”操作中添加了以下行:@ user.accounts_users.build(:account_id =&gt; current_account.id)

1 个答案:

答案 0 :(得分:0)

&#34;我希望用户能够使用下面的表单向他们的帐户添加更多用户。&#34;我假设您的意思是个人资料(因为您的嵌套表单位于个人资料中)?

如果是这种情况,我认为您的UsersController的创建操作并不是通过使用new来将配置文件与用户相关联。

试试这个......

def new
  @user = User.build
  @profile = @user.profiles.build #build adds the profile to user's associated collection of profiles, but new doesn't

  ...
end

def create
  @user = User.build(params[:user])
  if @user.save
    ....
  end
end

如果您希望用户与帐户关联,那么您需要在AccountsController中放置new和create操作,并执行与用户和配置文件记录的嵌套关联类似的操作。

回到新的原因是因为你在创作结束时渲染了新的,以防这也是问题的一部分。希望有所帮助!