Атрибут не устанавливается - PullRequest
0 голосов
/ 28 марта 2011

У меня есть этот код рубина для переключателей в моей пользовательской форме new:

<%= f.fields_for :profile, Profile.new 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 %>    

Я хочу установить атрибут type моей модели профиля.Однако тип не задан и по умолчанию равен nil.Я попытался создать этот метод create в контроллере своего профиля, но он не сработал:

def create
  @profile = Profile.find(params[:id])
  if params[:profile_attributes][:type] == "artist"
    @profile.type = "artist"
  elsif params[:profile_attributes][:type] == "listener"
    @profile.type = "listener"
  end
end

Как мне правильно установить type для "Artist" или "Listener"?

ОБНОВЛЕНИЕ:

Я получаю эту ошибку: WARNING: Can't mass-assign protected attributes: type

Ответы [ 3 ]

0 голосов
/ 28 марта 2011

Мой первый ответ был плохим:

Убедитесь, что строки вашего типа имеют CamelCased. Кроме того, я считаю, что тип - это attr_protected, то есть вы не можете установить его через attr_accesible.

Нечто подобное может заставить вас двигаться в правильном направлении:

class ProfilesController < ApplicationController
  def create
    @profile = profile_type.new(pararms[:profile])
    if @profile.save(params[:profile])
      # ...
    else
      # ...
    end
  end

private

  def profile_type
    params[:profile][:type].classify.constantize if %w(Artist Listener).include? params[:profile][type]
  end

end
0 голосов
/ 28 марта 2011

Я думаю, вы хотите получить к нему следующий доступ:

params[:user][:profile_attributes][:type]

Ваш взгляд должен выглядеть примерно так:

<%= form_for(setup_user(@user)) do |f| %>
  <p>
    <%= f.label :email %>
    <br/>
    <%= f.text_field :email %>
  </p>
  <%= f.fields_for :profile do |profile| %>
    <%= profile.label :username %>
    <br/>
    <%= profile.text_field :username %>

и в ваших помощниках / application_helper.rb

  def setup_user(user)
    user.tap do |u|
      u.build_profile if u.profile.nil?
    end
  end

Это всего лишь пример.

0 голосов
/ 28 марта 2011

Попробуйте эту функцию:

   <%= f.fields_for :profile, @user.build_profile(:type => "Artist") do |t| %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...