我有一个User
模型has_one :profile
,而profile
模型的单表继承有type
列。我希望用户在注册时设置type
,而我在执行此操作时遇到了麻烦。
我正在我的个人资料控制器中尝试这个:
def create
@profile = Profile.find(params[:id])
type = params[:user][:profile_attributes][:type]
if type && ["Artist","Listener"].include?(type)
@profile.update_attribute(:type,type)
end
end
这是我User
新视图的形式:
<%= form_for(setup_user(@user)) do |f| %>
...
<%= f.fields_for :profile do |t| %>
<div class ="field">
<%= t.label :type, "Are you an artist or listener?" %><br />
<p> Artist: <%= t.radio_button :type, "Artist" %></p>
<p> Listener: <%= t.radio_button :type, "Listener" %></p>
</div>
<% end %>
...
<% end %>
并在我的应用程序助手中:
def setup_user(user)
user.tap do |u|
u.build_profile if u.profile.nil?
end
end
创建用户时似乎无法设置type
。它仍默认为nil
。为什么这样,我怎么能完成它?我很感激代码示例。
更新:
这是我的User
模型中的相关代码:
has_one :profile
accepts_nested_attributes_for :profile
before_create :build_profile
更新2:我收到此错误:WARNING: Can't mass-assign protected attributes: type
答案 0 :(得分:1)
看起来该对象未保存到数据库中。尝试这样的事情:
def create
@profile = Profile.find(params[:id])
type = params[:user][:profile_attributes][:type]
if type && ["Artist","Listener"].include?(type)
@profile.update_attribute(:type,type)
end
end
答案 1 :(得分:1)
您可以通过添加
解决上一期的问题attr_accessible :type
答案 2 :(得分:1)
“type”是受保护的属性,您无法批量分配受保护的属性。
列'type'保留用于在继承的情况下存储类。尝试将表列重命名为“modelname_type”。
答案 3 :(得分:0)
将create方法替换为:
def create
profile_type = params[:user][:profile][:type].constantize
if ["Artist", "Listener"].include? profile_type
@profile = current_user.profile = profile_type.new
current_user.save!
else
flash[:alert] = "Profile type not supported"
end
end
更新:这不是必需的。也许有用的代码,但不是必须作为上述问题的解决方案。