ruby-on-rails – Rails设计多态 – 使用Ajax渲染部分渲染

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – Rails设计多态 – 使用Ajax渲染部分渲染前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经实现了从 this answer开始使用多个模型进行设计注册.这样就可以从路径中获取params user_type.
我想用select user_type更改它.因此,当我在select_tag上选择一个值时,将获得一个param user_type.

我有一些代码看起来像:

的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上

解决方法

你在这里混淆了几件事.

>您的路线定义默认值

如果您需要从下拉列表中进行选择,则无需在此处定义默认值.它只会让事情复杂化

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,selected: '-- User Type --' )) %>

猜你在找的Ruby相关文章