7

この回答から、複数のモデルでデバイス登録を実装しました。これは、パスからパラメーターを取得user_typeします。これを select で変更したいuser_type。したがって、で値を選択すると、パラメーター user_type が取得されselect_tagます。

次のようなコードがあります。

ルート.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

4

4 に答える 4

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要素が表示されないことを意味します。これは、システムのどの部分が機能していないかを私たちが知らないという事実にさらに拍車をかけます --

あなたのアヤックスは発砲していますか?ルートはリクエストを正しく送信していますか?


個人的には、システムのこの部分がどのように機能するかを再考します

レンダリングされたselectuser.js.erbからロジックを削除し、次のようにコントローラーに配置します。

  def selectuser

  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

    respond_to do |format|
      format.js { @render = child_class_name.underscore + '_fields', @rf = rf}
    end
  end

次に、JS で、JS に本来の目的を実行させることができます。

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

これは、child_class_name_fields.html.erb に次のようなものが必要であることを意味します。

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

アップデート

まったく別の方法で行うので、実際に今これに苦労しています。ロジック全体をコントローラーに移動し、:render 関数を介してパーシャルに変数のみを送信します。

その場で「f.fields_for」を生成しようとしているという考えは好きではありません-それはすでに設定されている必要があり、そのブロック内のフィールドのみを変更します。これはDRY (Don't Repeat Yourself)プログラミングとして知られる原則です。必要に応じて、これにモンキーパッチを適用する代わりに、私の好みのバージョンを作成できますか?

于 2013-10-23T09:41:47.277 に答える
0

パーシャルをレンダリングしようとするときは、 = を追加する必要があります。

<%=  params[:user][:usertype] ||= 'admin'
# ^ This makes whatever is being returned in this block to be added to the output
于 2013-10-29T23:57:13.990 に答える