因此,我正在尝试在“用户注册”表单中添加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
但我觉得这并不像我应该做的那样接近。任何帮助,将不胜感激!谢谢!
答案 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中的那个,并将我的对象的保存代码放在那里。