无法在我的Profile模型中为STI获取我的类型属性

时间:2011-03-28 00:12:36

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个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

4 个答案:

答案 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

更新:这不是必需的。也许有用的代码,但不是必须作为上述问题的解决方案。