2013-10-18 13 views
7

this answer'dan çoklu modelle düzenleme kaydı uyguladım. Bu tutuklar yoldan user_type paramlarını alır. Seçimi user_type ile değiştirmek istiyorum. Yani select_tag'da bir değer seçtiğimde bir param user_type alacak.Raylar Devise Polimorfik - Ajax Kullanarak Parçayı İşe Alma

Bazı kod görünüyor var gibi:

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

0 Ben yönetici değerini seçtiğinizde
<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 %>"); 

, log:

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) 

Ama _admin_fields.html.erb#selectuser

+0

, sunucuyu dokunma sadece şablonuna kod gerek yoktur. –

+0

@BillyChan: Ne demek istiyorsun anlamıyorum? – itx

cevap

0

üzerinde birkaç şeyler karıştırma görünmez İşte. Eğer bir açılır menüden seçmek gerekirse

  • senin yolları bir öntanımlıyı

tanımlamak, burada bir varsayılan değer tanımlamak için gerek yoktur. Sadece şeyler

match '/add_user' => 'registrations#new', :user => { :usertype => nil } 
match '/select/admin' => 'registrations#selectuser', :user => { :usertype => 'admin' } 
match '/select/player' => 'registrations#selectuser', :user => { :usertype => 'player' } 
  • doğru formu yardımcıları size params[:user][:usertype] bir çıktısını almak istiyorsanız f.select kullanmaya gerek

kullanmıyorsanız zorlaştırmaktadır. Modelinizde böyle bir özellik yoksa, modelinize attr_accessor olarak ekleyebilirsiniz. Denetleyiciniz dosya iade kontrolörü sizin ajax çalışması için aşağıdaki ile enjekte json döndürür

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

yılında

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

Teşekkürler phoet, denedim ama değişiklik yok ve hala çalışmıyor. – itx

+0

Kullanıcı modelinde – itx

0

-

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

Bence sen bir çok problemle var ancak en büyük değer burada:

Bir değişkene "fields_for" yardımcı oluşturmaya çalışıyorsunuz. Sorun, bu değişkenin bir dize olarak ele alınmasıdır, yani artık bir yardımcı değildir ve fields_for öğesinin görünmesine neden olmaz.Bu, sisteminizin hangi parçasının çalışmadığını bilmememiz gerçeğidir -

Ajax'ınız ateşleniyor mu? Rotalarınız talebi doğru bir şekilde gönderiyor mu? Şahsen


, senin sisteminin bu bölümü

Ben senin render selectuser.js.erb dan mantık kaldırmak ve bu gibi denetleyici içine koyardı nasıl çalıştığını yeniden düşünürdüm :

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

sizin JS Sonra

, sen JS o doğdum yapalım mümkün olurdu Tamamen bunu çünkü ben aslında Şimdi bununla mücadele ediyorum

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

Güncelleme:

Bu child_class_name_fields.html.erb içinde, böyle bir şey olması gerektiği anlamına gelmektedir farklı. Tüm mantığı denetleyiciye taşıyacağım ve yalnızca değişkenleri kısmi olarak şu işlevin içine göndereceğim: render işlevi.

"f.fields_for" öğesini üretmeye çalıştığınız fikri beğenmedim - zaten ayarlanmış olmalı ve yalnızca bu bloktaki alanları değiştirdiniz. DRY (don't repeat yourself) programlama olarak bilinen bir ilkedir. İsterseniz, tercih ettiğim sürümü size yazabilirim, bunun yerine monkeypatch'u denemek ister misiniz? Eğer işlemek çalışırken

+0

kullanıcı özelliklerine sahip olduğum için teşekkür ederim. Zengin peck, kodunuzda hata görüyorum, bkz. "Nesteds = fields_for child_class_name.constantize.new do | rf |" wirhout 'end'? – itx

+0

hmmmm Bunu görmedim! Ben dürüst^_^ –

+0

olmak için farklı bir kod yapmak ama kodunuzu denedim, sözdizimi hatası, beklenmedik $ end, keyword_end bekliyoruz gibi bir hata var. Yuvalar kullanılmayacaksa hangi değişkenler için 'nesteds'. – itx

0

Bir = eklemek zorunda senin kısmi:

cinsiyet tüm erkek ve dişi ilgiliyse
<%= params[:user][:usertype] ||= 'admin' 
#^This makes whatever is being returned in this block to be added to the output 
İlgili konular