Как мне использовать вложенный атрибут с методом выбора form_for?

У нас есть user модель, которая :has_one detail, В form_for пользователь, я хочу раскрывающийся список, чтобы выбрать детали пользователя " time_zone,

я пробовал

<% form_for @user do |f| %>
    ... user stuff ...

    <%= f.select :"detail.time_zone", ...other args... %>
<% end %>

но я получаю NoMethodError для detail.time_zone. Каков правильный синтаксис для этого - или если это невозможно сделать таким образом, как я должен это делать?

2 ответа

Решение

Не забудьте использовать accepts_nested_attributes_for в вашей модели пользователя:

class User < ActiveRecord::Base
  has_one :detail
  accepts_nested_attributes_for :detail
end

Модель детали:

class Detail < ActiveRecord::Base
  belongs_to :user
end

Пользовательский контроллер:

class UsersController < ActionController::Base
  def new
    @user = User.new
    @user.build_detail
  end
end

Пользователь новый / редактировать вид:

<% form_for @user do |u| %>
  <% u.fields_for :detail do |d| %>
    <%= d.select :country, Country.all.map { |c| [c.name, c.id] }
    <%= d.time_zone_select :time_zone %>
  <% end %>
<% end %>

Почему после двоеточия f.select? Также это должно быть <%=... и не <%..

Предполагая, что у вас есть столбец time_zone в вашей таблице,

<% form_for @user do |f| %>
    ... user stuff ...

    # args: user object, time_zone method, prioritizing zones(separating list), default
    <%= f.time_zone_select :time_zone, nil, :default => "Pacific Time (US & Canada)", :include_blank => false %>
<% end %>

Дополнительный ресурс:

http://railscasts.com/episodes/106-time-zones-in-rails-2-1

http://railsontherun.com/2007/12/21/timezone-selection/

Другие вопросы по тегам