如何在form_for的select方法中使用嵌套属性?

时间:2010-06-24 09:28:09

标签: ruby-on-rails ruby erb rhtml

我们有一个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 个答案:

答案 0 :(得分:3)

不要忘记在您的用户模型中使用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 %>

答案 1 :(得分:0)

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/