2013-10-18 8 views
7

私はthis answerから複数のモデルを使ってデバイス登録を実装しています。このtutsはパスからuser_typeパラメータを取得します。 セレクトuser_typeでこれを変更したいと思います。したがって、select_tagの値を選択すると、パラメータuser_typeが取得されます。Railsは多態型を扱う - Ajaxを使って部分をレンダリングする

私はいくつかのコードは次のようになります:

routes.rbを

namespace :cp do 
    devise_scope :user do 
    match '/add_user' => 'registrations#new' 
    match '/select/admin' => 'registrations#selectuser', :user => { :usertype => 'admin' } 
    match '/select/player' => 'registrations#selectuser', :user => { :usertype => 'player' } 
    end 
    end 

registrations_controller.rb

def selectuser 

    respond_to do |format| 
     format.js 
    end 
    end 

new.html.erb

<h2>Add User</h2> 

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

    <div><%= f.label :username, "Username" %><br /> 
    <%= f.text_field :username %></div> 

    <div><%= f.label :email, "Email" %><br /> 
    <%= f.email_field :email %></div> 

    <div><%= f.label :password, "Password" %><br /> 

    <%= f.password_field :password %></div> 

    <div><%= f.label :password_confirmation, "Password Confirmation" %><br /> 
    <%= f.password_field :password_confirmation %></div> 

    <div><%= f.label :usertype, "Select User Type" %><br /> 
    <%= f.select(:usertype, options_for_select([['-- User Type --', nil], ['Admin', 'admin'], ['Player', 'player']], selected: '-- User Type --')) %> 
    </div> 

    <div id="selectuser"> 
    </div> 
    <% end %> 

    <div><%= f.submit "Submit" %></div> 
<% end %> 

<script type="text/javascript"> 
$("#user_usertype").on('change', function() { 
    var s = $(this).val(); 
     $.ajax({ 
       type: 'GET', 
       url: 'http://localhost:3000/cp/select/' + s, 
       dataType: "HTML" 
       }); 
}); 
</script> 

selectuser.js.erb

<% params[:user][:usertype] ||= 'admin' 

    if ["admin", "player"].include? params[:user][:usertype].downcase 
     child_class_name = params[:user][:usertype].downcase.camelize 
     usertype = params[:user][:usertype].downcase 
    else 
     child_class_name = "Admin" 
     usertype = "admin" 
    end 


    nesteds = fields_for child_class_name.constantize.new do |rf| 
    render :partial => child_class_name.underscore + '_fields', :locals => {:f => rf} 
    end 
%> 
$("#selectuser").append("<%= j nesteds %>"); 

私が管理値を選択すると、ログ:

Started GET "/cp/select/admin" for 127.0.0.1 at 2013-10-21 17:00:04 +0700 
Processing by Cp::RegistrationsController#selectuser as HTML 
    Parameters: {"user"=>{"usertype"=>"admin"}} 
    Rendered cp/registrations/_admin_fields.html.erb (4.0ms) 
    Rendered cp/registrations/selectuser.js.erb (7.0ms) 
Completed 200 OK in 22ms (Views: 22.0ms | ActiveRecord: 0.0ms) 

しかし_admin_fields.html.erb#selectuser

+0

、ちょうどテンプレートでそれをコーディング、サーバーに触れる必要はありません。 –

+0

@BillyChan:どういう意味ですか? – itx

答えて

0

に表示されていない、あなたは、いくつかの物事を混合していますここに。

  • あなたのルートは、ドロップダウンから選択する必要がある場合は、ここではデフォルト値を定義する必要はありませんデフォルト

を定義します。それだけで物事

match '/add_user' => 'registrations#new', :user => { :usertype => nil } 
match '/select/admin' => 'registrations#selectuser', :user => { :usertype => 'admin' } 
match '/select/player' => 'registrations#selectuser', :user => { :usertype => 'player' } 
  • あなたは右のフォームヘルパーあなたはparams[:user][:usertype]の出力を取得したい場合f.selectを使用する必要が

を使用していないことを複雑にしています。モデルにそのようなプロパティがない場合は、モデルにattr_accessorとして追加できます。

<%= label :usertype, "Select User Type" %><br /> 
<%= select_tag(:usertype, options_for_select([['-- User Type --', nil], ['Admin', 'admin'], ['Player', 'player']], selected: '-- User Type --')) %> 
+0

ありがとう、私はそれを試みましたが、変更はありませんし、まだ動作しません。 '' end' wirhout | RF | – itx

+0

は、Iユーザモデルの属性ユーザータイプ – itx

0
お使いのコントローラファイルリターンで

render json: {"fields" => render_to_string(partial: "admin_fields") } 

コントローラは、あなたのAjaxの機能にJSONを返すとき、次を注入 -

$('#selectuser').html(fields) 
0

私はあなたが多くの問題を持っていると思いますしかし、最大のものはここにあります:

nesteds = fields_for child_class_name.constantize.new do |rf| 
render :partial => child_class_name.underscore + '_fields', :locals => {:f => rf} 

変数に "fields_for"ヘルパをレンダリングしようとしています。問題はこの変数が文字列として扱われることです。つまり、もはやヘルパーではなく、fields_for要素が表示されません。

は、あなたのAjaxの発火している - これは、私たちが働いていない、あなたのシステムのどの部分を知らないという事実のために更なるでしょうか?経路が要求​​を正しく送信していますか?個人的に


、私はあなたのシステムのこの部分は

をどのように動作するか私はあなたのレンダリングselectuser.js.erbからロジックを削除し、コントローラに入れて、次のようになり、再思うだろう:

$("#selectuser").html("<%=j render :partial => @render, locals: {:f = @rf} %>"); 
01:

は、その後、あなたのJSで、あなたはJSはそれが生まれた何をやらせることができるだろう私は完全にそれを行うだろうので、私は実際に今、これで苦労しています

<%= f.fields_for child_class_name.constantize.new do |rf| %> 
    <%= rf.text_field :name %> 
<% end %> 

更新:

これはあなたのchild_class_name_fields.html.erbで、あなたはこのような何かを持っている必要があることを意味します異なっている。私はロジック全体をコントローラに移して、:render関数を使ってパーシャルにのみ変数を送ります。

私はあなたがその場で「f.fields_for」を生成しようとしているという考えを好きではない - それはすでに設定されなければならない、とあなただけのそのブロック内のフィールドを変更します。これは、DRY (don't repeat yourself)プログラミングと呼ばれる原理です。あなたが望むなら、monkeypatchにこれを試してみるのではなく、私の好きなバージョンを書くことができますか?あなたはあなたの部分をレンダリングしようとしているとき=を追加する必要が

+0

おかげで豊かなペックを持って、私はあなたのコードに表示 'nesteds = fields_for child_class_name.constantize.new DOを参照して、エラーになりますか? – itx

+0

hmmmm私はそれを見ませんでした!^_^ –

+0

コードを試したときに、 'syntax error、unexpected $ end、expecting keyword_end'のようなエラーが発生しました。 'nesteds'が使用されない場合、どの変数' nesteds'に対してですか? – itx

0

:性別はすべての男性と女性についてです場合

<%= params[:user][:usertype] ||= 'admin' 
#^This makes whatever is being returned in this block to be added to the output 
関連する問題