在Rails 4中多模型注册与清除



所以我想创建一个公司,同时作为一个新用户注册到我的应用程序。我使用https://github.com/thoughtbot/clearance进行身份验证。

我有这两个迁移:

class CreateCompanies < ActiveRecord::Migration
  def change
    create_table :companies do |t|
      t.string :name, null: false
      t.string :email, null: false
      t.attachment :logo
      t.timestamps null: false
    end
  end
end

class CreateClearanceUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :email, null: false
      t.string :encrypted_password, limit: 128, null: false
      t.string :confirmation_token, limit: 128
      t.string :remember_token, limit: 128, null: false
      t.string :first_name
      t.string :last_name
      t.attachment :avatar
      t.integer :company_id
      t.timestamps null: false
    end
    add_index :users, :email, unique: true
    add_index :users, :remember_token
  end
end

我的模特是这样的:

class User < ActiveRecord::Base
  include Clearance::User
  belongs_to :company
end
class Company < ActiveRecord::Base
  has_many :users
  accepts_nested_attributes_for :users
end

这是我改变的间隙控制器:

class Clearance::UsersController < ApplicationController
  before_filter :redirect_signed_in_users, only: [:create, :new]
  skip_before_filter :require_login, only: [:create, :new]
  skip_before_filter :authorize, only: [:create, :new]
  def new
    @user = User.new
    @user.build_company
    render template: "users/new"
  end
  def create
    @user = User.new(user_params)
    if @user.save
      sign_in @user
      redirect_back_or url_after_create
    else
      render template: "users/new"
    end
  end
  private
  def avoid_sign_in
    warn "[DEPRECATION] Clearance's `avoid_sign_in` before_filter is " +
      "deprecated. Use `redirect_signed_in_users` instead. " +
      "Be sure to update any instances of `skip_before_filter :avoid_sign_in`" +
      " or `skip_before_action :avoid_sign_in` as well"
    redirect_signed_in_users
  end
  def redirect_signed_in_users
    if signed_in?
      redirect_to Clearance.configuration.redirect_url
    end
  end
  def url_after_create
    Clearance.configuration.redirect_url
  end
  def user_params
    params.require(:user).permit(:first_name, :last_name, :email, :password, companies_attributes: [:id, :name])
  end
end

最后我的形式:

<div class="form-item">
  <%= form.label :first_name %>
  <%= form.text_field :first_name, type: "text" %>
</div>
<div class="form-item">
  <%= form.label :last_name %>
  <%= form.text_field :last_name, type: "text" %>
</div>
<div class="form-item">
  <%= form.label :email %>
  <%= form.text_field :email, type: "email" %>
</div>
<div class="form-item">
  <%= form.fields_for :companies do |builder| %>
    <label>Company</label>
    <%= builder.text_field :name, type: "text" %>
  <%end%>
</div>
<div class="form-item">
  <%= form.label :password %>
  <%= form.password_field :password %>
</div>

我可以完美地提交我的表单,但我的company_id是nil时,在rails控制台找到用户对象。

谁知道我做错了什么?

提前感谢!

你需要使用单数:

= form.fields_for :company

在你的控制器中:

company_attributes # instead of companies_attributes

你有一个东西在错误的模型中!你想保存一个公司与用户,所以你需要移动accepts_nested_attributes_foruser.rb

accepts_nested_attributes_for :company

相关内容

  • 没有找到相关文章

最新更新