我已经实现了从
this answer开始使用多个模型进行设计注册.这样就可以从路径中获取params user_type.
我想用select user_type更改它.因此,当我在select_tag上选择一个值时,将获得一个param 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 --' )) %>