Rails:无法将belongs_to关系添加到Devise User Registration表单

时间:2013-05-28 16:59:25

标签: ruby-on-rails ruby devise

因此,我正在尝试在“用户注册”表单中添加belongs_to关系的选择。

例如:

以下是用户模型:

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me
  # attr_accessible :title, :body
  belongs_to :thing
  validates_presence_of :thing
end

事物模型:

class Thing < ActiveRecord::Base
  attr_accessible :name
  has_many :user
  validates_presence_of :name
  validates :name, :uniqueness => { :case_sensitive => false }
end

所以,我在app / views / devise / registration / new.html.haml文件中添加了一些代码:

%h2 Sign up

= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f|
  = devise_error_messages!

  %div
    = f.label :email
    %br
    = f.email_field :email, :autofocus => true

  %div
    = f.label :password
    %br
    = f.password_field :password

  %div
    = f.label :password_confirmation
    %br
    = f.password_field :password_confirmation

  %div
    = f.label :thing
    %br
    = f.select :thing, @things.map{ |r| [r.name, r.id] }

  %div
    = f.submit "Sign up"

= render "devise/shared/links"

所以一切正常,我可以从选择框中选择内容。但是,处理提交是我感到困惑的事情。有了这个,我得到一个“无法大量分配受保护的属性”错误,这应该是它应该做的。

如何覆盖Devise控制器来处理这个问题?我尝试过类似的东西:

class RegistrationsController < Devise::RegistrationsController
  def new
    @things = Thing.all.sort_by{|e| e[:name]}
    super
  end
  def create
    @user = User.new(params[:user][:email], params[:user][:password])
    @user.thing = params[:user][:thing]
    super
  end
end 

但我觉得这并不像我应该做的那样接近。任何帮助,将不胜感激!谢谢!

2 个答案:

答案 0 :(得分:0)

如果没有数据库更改,则无法在两个模型之间添加关系。 Rails不会自动更改数据库,您需要为此编写迁移。您可以检查on rails guides如何添加rails has_many关系,总的来说,我建议在开始使用rails之前在模型/视图/控制器部分表单索引中读好。阅读这些东西不应该花费你两天时间,如果你明白自己在做什么,你将能够更好/更快地做事。

答案 1 :(得分:0)

所以我明白了。

我必须在Registrations控制器中添加一个create方法来覆盖Devise。

class RegistrationsController < Devise::RegistrationsController
  def new
    @things = Thing.all.sort_by{|e| e[:name]}
    super
  end

  def create
    @things = Thing.all.sort_by{|e| e[:name]}
    @user = User.new(email: params[:user][:email], password: params[:user][:password], password_confirmation: params[:user][:password_confirmation])
    @user.thing = Thing.find(params[:user][:thing])

    if @user.save
      if @user.active_for_authentication?
        set_flash_message :notice, :signed_up if is_navigational_format?
        sign_up(:user, @user)
        respond_with @user, :location => after_sign_up_path_for(@user)
      else
        set_flash_message :notice, :"signed_up_but_#{@user.inactive_message}" if is_navigational_format?
        expire_session_data_after_sign_in!
        respond_with @user, :location => after_inactive_sign_up_path_for(@user)
      end
    else
      clean_up_passwords @user
      respond_with @user
    end
  end
end 

我基本上复制并粘贴了Devise source code中的那个,并将我的对象的保存代码放在那里。