2012-03-08 10 views
0

私は何時間もこれを理解しようとしていましたが、私は同様の質問をすべてレビューしましたが、Rails 3ネストされたフォームで、デバイスフィールドがレンダリングされていない

私はビューが隠しフォームをレンダリングしませんので、

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 

などの登録コントローラをオーバーライドしている次の形式

登録/ 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 %> 

を持っています私がf変数を削除すると、user_rolesのフィールドがレンダリングされます。

私は新しいアクションでuser_rolesのプレースホルダインスタンスを構築していますが、これは何の違いもありません。私はaccepts_nested_attributes_for :user_rolesを設定しました。

これはとにかく私の注意をそらすものです。どんな助けでも大歓迎です。

答えて

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 

を持っている私のユースケースは、Iでありますサイトに登録しているユーザーを主催者の役割にして、サプライヤまたはメンバーの役割のいずれかのシステムに他のユーザーを追加することができます。アプリケーション内のユーザーの作成を処理するために、私はユーザーコントロールを使用して、オーガナイザーがユーザーを特定の役割に追加することができます。

users_controllerための新しいアクションのコードは次のとおりです。

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

ユーザー/ 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]})) 

問題は、このコードの作品とするとき、私ですそれが動作しなかった登録コントローラでコピーしようとしました。私は理由を理解することはできません、任意の提案をいただければ幸いです。

希望すると便利です。

関連する問題