Не удается получить атрибут типа, установленный в моей модели профиля для STI - PullRequest
0 голосов
/ 28 марта 2011

У меня есть модель 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. Почему это так и как я могу это сделать? Буду признателен за пример кода.

UPDATE:

Это соответствующий код в моей User модели:

has_one :profile 
accepts_nested_attributes_for :profile
before_create :build_profile

ОБНОВЛЕНИЕ 2: Я получаю эту ошибку: WARNING: Can't mass-assign protected attributes: type

Ответы [ 4 ]

1 голос
/ 11 мая 2011

«тип» является защищенным атрибутом, и вы не можете массово назначить защищенный атрибут.

Столбец «тип» зарезервирован для хранения класса в случае наследования. Попробуйте переименовать столбец таблицы во что-то вроде "modelname_type".

1 голос
/ 28 марта 2011

Ваша последняя проблема может быть решена добавлением

attr_accessible :type
1 голос
/ 28 марта 2011

Похоже, объект не сохраняется в базе данных.Попробуйте что-то вроде этого:

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
0 голосов
/ 28 марта 2011

Замените ваш метод создания следующим:

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

ОБНОВЛЕНИЕ: Это не является действительно необходимым.Возможно, полезный код, но не обязательный для решения вышеуказанной проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...