Rails 3嵌套表单,设计字段无法呈现

时间:2012-03-08 21:47:45

标签: ruby-on-rails devise nested-forms

我一直在试图解决这个问题几个小时,我已经审查了所有关于SO的类似问题,但似乎没有任何效果。

我有以下表格

注册/ new.html.erb

      <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
    <%= devise_error_messages! %>

    <%= f.fields_for :user_roles do |builder| %> 
      <%= builder.hidden_field :role_id, :value => @role.id %>
    <% end %>

我已经覆盖了注册控制器,如此

class Users::RegistrationsController < Devise::RegistrationsController
  prepend_before_filter :require_no_authentication, :only => [ :new, :create ]
  layout "public"

  def new 

    @user = User.new
    @user.user_roles.build()
    @role = Role.find_by_name("organiser")
    super
  end

视图不呈现隐藏的表单,如果我删除f变量,则会呈现user_roles的字段。

我正在新操作中构建user_roles的占位符实例,但这似乎没有任何区别。我已设置accepts_nested_attributes_for :user_roles

无论如何,这让我分心,任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题,但我不确定为什么会这样。 (用**包围的变化)

在我的视图中

    <%= f.fields_for **:user_roles, @user_roles** do |builder| %> 
      <%= builder.hidden_field :role_id, :value => @role.id %>
    <% end %>

在我的设计注册控制器的新动作中,我有

  def new 
    @user = User.new
    **@user_roles = [@user.user_roles.build ]**
    @role = Role.find_by_name("organiser")
    super
  end

我的用例如下,我希望在网站上注册的人员处于组织者角色,然后他们可以在供应商或成员角色中将其他用户添加到系统中。为了处理在应用程序内创建用户,我有一个用户控制器,允许组织者将用户添加到特定角色。

users_controller的新操作中的代码是:

  def new
    @user = @wedding.users.new
    @roles = @wedding.roles
    1.times{ @user.user_roles.build() }
  end

users / new.html.haml中的嵌套表单是:

    = f.fields_for :user_roles do |builder| 
      %p
        = f.label :roles
        = builder.select(:role_id, options_for_select(@roles.map {|role| [role.name, role.id]}))

问题是这个代码有效,当我试图在注册控制器中复制它时,它不起作用。我无法弄清楚为什么,任何建议都会受到赞赏。

希望这有用。