вложенная форма, которая размещается на многих страницах по всему приложению

У меня есть форма с вложенными атрибутами, которую мне нужно разместить на многих разных страницах. Не обязательно к той модели, к которой он принадлежит. Итак, у меня есть эта форма на странице шоу батальонов. Информация о пользователе создается нормально, но у пользователя есть_many ролей, и эти атрибуты не создаются. У меня есть много других вложенных форм, которые работают нормально, я не могу понять, чего мне не хватает, чтобы эта работа работала.

class User < ActiveRecord::Base  
  has_many :roles   
  accepts_nested_attributes_for :roles, :allow_destroy => true

      def active?
  active
end

def activate!(params)
  self.active = 1
  self.login = params[:user][:login]
  self.password = params[:user][:password]
  self.password_confirmation = params[:user][:password_confirmation]
  save
end

def deliver_activation_instructions!
    reset_perishable_token!
    NotifierMailer.deliver_activation_instructions(self)
end

def deliver_activation_confirmation!
    reset_perishable_token!
    NotifierMailer.deliver_activation_confirmation(self)
end

def has_no_credentials?
    self.crypted_password.blank?
end

def signup!(params)
    self.login = params[:user][:login]
    self.email = params[:user][:email]
    self.name = params[:user][:name]
    self.position = params[:user][:position]
    self.battalion_id = params[:user][:battalion_id]
    self.company_id = params[:user][:company_id]
    self.platoon_id = params[:user][:platoon_id]

    save_without_session_maintenance
end
end 

class Role < ActiveRecord::Base  
  belongs_to :user  
end  


<% form_for :user, @user, :url => users_path do |f| %>
        <%= f.error_messages %>
      <% f.fields_for :roles do |f| %>
        <%= render :partial => "role", :locals => { :f => f, :role => 'battalion'} %>
      <% end %>
        <%= render :partial => "form", :locals => { :f => f, :position => 'Battalion Commander', :company => 'nil'} %>
      <%= f.submit "Register" %>
    <% end %>

_role.html.erb

<%= f.hidden_field(:name, :value => role) %>

_form.html.erb

<%= f.hidden_field(:position, :value => position) %>
<%= f.hidden_field(:battalion_id, :value => @battalion.id) %>
<%= f.hidden_field(:company_id, :value => company) %>

<%= f.label(:name, "Name:") %>
<%= f.text_field :name%>
<br />
<%= f.label(:email, "E-Mail:") %>
<%= f.text_field :email%>
<br />

Вот что происходит, когда я создаю пользователя:

Обработка UsersController # create (для 127.0.0.1, 14.02.2010 22:15:16) [POST] Параметры: {"user" => {"name" => "Chirs", "roles" => {"name "=>" батальон "}," company_id "=>" nil "," position "=>" Командир батальона "," email "=>" [email protected] "," battalion_id "=>" 1 "}, "commit" => "Зарегистрироваться", "action" => "create", "Authentity_token" => "PcGbsQNG7wKKPDZTM + JGry / a1aBWZuoyaCNwlqlCJ0g =", "controller" => "users"}

Я просто не запускаю действие create для ролей.

Кажется, что это должно быть довольно просто, я предполагаю, что удаление этого от пользовательской модели создает проблему. Если это будет form_for @battalions, а затем сделать User nested и Role вложенным, это будет три уровня, и это просто не кажется правильным.

Любая помощь будет принята с благодарностью.


person looloobs    schedule 15.02.2010    source источник


Ответы (1)


При работе с accept_nested_attributes_for вам необходимо присвоить "# {association} _attributes". В вашем случае вам нужны roles_attributes.

fields_for при использовании в сочетании с accept_nested_attributes_for должен генерировать правильный HTML.

Ваши представления / частичные данные кажутся правильными, но ваше скрытое поле не генерирует правильный входной идентификатор.

Единственный способ воспроизвести вашу проблему - когда @user равен нулю. Есть ли вероятность, что вы забыли инициализировать пользователя перед использованием этой формы. При использовании одного и того же партиала на нескольких страницах не сложно упустить из виду.

Просто убедитесь, что вы используете @user = User.new во всех действиях контроллера, которые отображают эту форму.

person EmFi    schedule 15.02.2010
comment
Спасибо за вашу помощь. У меня есть accept_nested_attributes_for: roles,: allow_destroy = ›true в пользовательской модели, разве этого недостаточно? Кажется, что это есть в других вложенных формах в приложении. Куда мне нужно назначить # {association} _attributes? Я не думаю, что проблема в пользователе, потому что я просто создаю пользователя, а не связанную с ним роль. Даже когда я пытаюсь сделать это прямо из модели User, у меня возникает та же проблема. Я использую Authlogic для создания своих новых пользователей, мне интересно, может ли это иметь какое-либо отношение к этому? Ценю, что вы смотрите на это. - person looloobs; 16.02.2010
comment
Еще одна вещь: когда я создаю нового пользователя, вот что происходит, и я не уверен, почему эта роль = ›#‹ Role: 0x19751ac ›здесь? Обработка UsersController # create (для 127.0.0.1, 15.02.2010, 15:30:52) [POST] Параметры: {user = ›{name =› John Jones, roles = ›#‹ Role: 0x19751ac ›, roles_attributes =› {0 = ›{name =› battalion}}, company_id = ›, login =› jjones2, platoon_id = ›, position =›, email = ›[email protected], battalion_id =›}, commit = ›Зарегистрироваться, action = ›Create, Authentity_token =› PcGbsQNG7wKKPDZTM + JGry / a1aBWZuoyaCNwlqlCJ0g =, controller = ›users} - person looloobs; 16.02.2010
comment
Каждый раз, когда вы создаете или обновляете пользователя и намереваетесь изменить связанные роли напрямую, вы должны назначать role_attributes. Когда вы используете accept_nested_attributes_for, это делается автоматически для вас, когда вы используете fields_for. Вы увидите это в именах входов, если проверите источник визуализированных представлений. - person EmFi; 16.02.2010
comment
Если вы не изменили что-то в своих представлениях, я понятия не имею, почему у вас есть атрибут дополнительных ролей для пользователя. - person EmFi; 16.02.2010
comment
Спасибо за вашу помощь, мне не хватало этого @user = User.new (params [: user]) в моем контроллере, вместо этого у меня был @user = User.new - person looloobs; 17.02.2010