2013-02-28 28 views
6

Kullanıcıların profil sayfasında bir soru (kullanıcı modeline ek olarak, iç içe yanıtlı bir soru modeli var) oluşturmak için bir formum var. Kullanıcı profili sayfası /views/users/show.html.erb adresinden, question_controller.rb dosyasının oluşturma eylemine sunulur. Doğrulama yapmazsa, Rails varsayılanı formunu (kullanıcı için düzenleme formundaki geçersiz bilgilerle) oluşturmaktır. Ancak, kullanıcı profili sayfasından soru modeli için form gönderdiğim için, başarısız doğrulama sırasında ön doldurma yapılmıyor; Kullanıcı formdaki tüm bilgileri tekrar girmeye zorlanır. Bu bağlamda, kullanıcıların sunum sayfasında girilen bilgilerle doldurabilmeleri için kullanıcılara gösterme formunun bir yolu var mı?Başarısız doğrulama hakkında formu yeniden oluşturma

questions_controller

def create 
    @question = current_user.questions.build(params[:kestion]) 

    if @question.save 
     redirect_to current_user, :notice => "Successfully created question." 
    else 
     ###render :action => 'show' 
     redirect_to current_user 

    end 
    end 

Güncelleme Ben oluşturmak yöntemle de

Redirect (: back), :notice => "something went wrong.try again" 

sonuna değiştirdik Ama yine formu doldurmak için alamayan ve doğrulama hata iletileri değiller ya da, sadece flaş bildirimi gösteriyor.

Güncelleme kullanıcıların kumandanın gösterisi yöntemi

def show 
     @user = User.find(params[:id]) 
     @question = Question.new 
     3.times {@question.answers.build} 

    end 

/views/users/show.html.erb

<%= form_for @question do |f| %> 
    <% if @question.errors.any? %> 
    <h2><%= pluralize(@question.errors.count, "error") %> prohibited this question 
    from being saved: </h2> 
    <ul> 
     <% @question.errors.full_messages.each do |msg| %> 
     <li> <%= msg %></li> 
    <% end %> 
    </ul> 
    <% end %> 
    <p> 
    <%= f.label :content, "Question"%> 
    <%= f.text_area :content, :class => 'span4', :rows => 1 %> 
    </p> 
    <p> 
    <%= f.label :link, "QuoraLink" %> 
    <%= f.text_field :link, :class => 'span4', :rows => 1 %> 
    </p> 
    <%= f.fields_for :answers do |builder| %> 
    <p> 
     <%= render 'answer_fields', :f => builder %> 
    </p> 
    <% end %> 
    <p><%= link_to_add_fields "Add Answer", f, :answers %></p> 
    <p><%= f.submit %></p> 
<% end %> 

answer_fields (kullanıcı) ile birlikte yeni soru yaratır kısmi sorulara göre kısmi

+0

'show' yöntemi, UsersController'ınızda nasıl görünüyor? Anladığım kadarıyla formu önceden dolduran yöntem budur. Ayrıca, görüşler/kullanıcılar/show.html. {Erb, haml} görünümü nasıl görünüyor? Parametreleri yol parametreleri üzerinden veya [] oturumundan geçirebilirsiniz, ancak muhtemelen burada bazı değişikliklere ihtiyacınız olacaktır. – moonfly

+0

@moonFly, Kullanıcı denetleyicisinden gelen gösterme yöntemini 'onaylamalısınız' formunu önceden doldurması gerekiyorsa (yani istediğim şey), ancak şu anda bunu yapmıyor. OP'yi görüntülediğimi önerdiğiniz kodla güncelledim. Başvuruda bulunduğunuz iki yöntemden herhangi biriyle geçerli değilse, yukarıdaki kodu nasıl değiştirebileceğimi söyleyebilir misiniz? – Leahcim

cevap

1

Halen görüntüleme/kullanıcılar/show.rb içinde boş bir yeni bir soru yaratır

@question = Question.new 

yok. Sonra formları bu boş modelle doldurursunuz. Bunun yerine ne olabilir: Artık

if session[:question] 
    @question = @user.questions.new(session[:question]) 
    session[:question] = nil 
    @question.valid? # run validations to to populate the errors[] 
else 
    @question = Question.new 
end 

oturumu doldurma yapmanız kalanları tüm [: soruyu] sizin questions_controller içinde yönlendirilmeden önce: => "kullanıcılar", denetleyici: => "gösteri" eylem. Sen oturumu kullanarak/doldurma için ayrıca seri hale/seri kaldırma üzerinde çalışmak gerekebilir

if @question.save 
    redirect_to current_user, :notice => "Successfully created question." 
else 
    session[:question] = params[:question] 
    redirect_to current_user 
end 

: Böyle bir şey [: Soru]. Derlemeye çalışmadım, emin değilim.

Tüm bunlar, kullanıcı isteğinin işlenmesiyle ilgili redirect_to işlemini yaptığınızda, sunucudan bir yönlendirme durum kodu alır ve başka bir sayfaya gider, çünkü size yeni bir istek gönderir. ve sonunda yeniden yönlendirdiğiniz denetleyici/eylem. Böylece, istek işleme sürecinden döndüğünüzde, tüm değişkenleriniz kaybolur. Bir sonraki istek için sıfırdan başlıyorsunuz.

render :action => "show" yaklaşımı (orjinal iskelede yer alan ve yorumda bulunduğunuz), kullanıcıya geri dönmediğiniz, ancak şablonu, önceden sahip olduğunuz değişkenleri kullanarak belirli bir adla oluşturduğunuz için çalıştı. 'save' çağrısının yapıldığı ve başarısız olduğu ve böylece içsel geçerlilikler hata nesnesi olarak adlandırıldı ve dolduruldu.

Aslında bunların başka bir yaklaşım kullanmak isteyebilirsiniz hatırlattı. Parametreleri session [] üzerinden geçirip UsersController'a yönlendirmek yerine, tüm gerekli değişkenleri doldurmak ve görünümü yalnızca o denetleyiciden oluşturmak isteyebilirsiniz. Aşağıda olduğu gibi:

if @question.save 
    redirect_to current_user, :notice => "Successfully created question." 
else 
    @user = current_user 
    render "users/show" 
end 
+0

İkinci kullanıcı "kullanıcı/şov" oluşturmayı denedim ancak sorunla karşılaştım. /views/users/show.html.erb adresinde Kullanıcılar kaynağına özel bir navigasyon kısmi var. Kontrolör – Leahcim

+0

seans çözümü (yani ben soru alanını yeniden oluşturulacaktır olabilir) sözü veriyor sorulardan/gösteriyi kullanıcıları oluşturulurken kısmi navigasyon eksik, ama aynı zamanda ben sadece benim gösteri eylem yeni bir soru oluşturmak görülen bir durumdur fakat edeceğiz üç cevap alanı-- 3 kez {@ question.answers.build} - oturumları bilgileri ile yeniden doldurmak için bunları nasıl alabilirim? – Leahcim

1

İlk olarak, render yerine redirect_to kullanarak, redirect_to, eylem için denetleyici mantığı çalıştırıldığında, render denetleyici mantığını yoksaydı, form yeniden doldurmuyor.

Ne zaman render :action => 'show' ("varsayılan" davranış), böyle @question set ile, show.html.erb vermektedir: Eğer redirect_to current_user, sizin show eylem kodunu kullanarak show.html.erb@question ile set vermektedir

@question = current_user.questions.build(params[:kestion]) 

:

@question = Question.new 
3.times {@question.answers.build} 

Bu nedenle önceden doldurulmuş olan yerine yeni (boş) bir form elde edersiniz.

Gerçekten sen redirect_to kullanmakönemli mi? Öyleyse, doğrulamayı yapmak için show yönteminizi almanız gerekir. Örneğin, böyle bir şey için show yöntemini yazabilirsiniz:

def show 
    @user = User.find(params[:id]) 
    if params.has_key?(:kestion) 
    @question = @user.questions.build(params[:kestion]) 
    else 
    @question = Question.new 
    3.times {@question.answers.build} 
    end 
end 

ve sonra böyle bir şeyle, o sayfasından formu noktayı:

<%= form_for(@question, url: users_path(@question.user) do |f| %> 
    ... 
<% end %> 

(senin yolları nasıl ayarlanır bağlı ve adlandırılmış).Tabii ki, bu noktada, her şey korkunç RESTful, biraz karışıklık ve kesinlikle bir şey yapmanın yolu değil. (Diğer, daha kötü bir seçenek geri yönlendirmek ve bir getiri sorgusu üzerinden paramları geçmek olabilir.) Benim düşünceme göre, küçük bir kazanç için çok şey kaybedersiniz ve gerçekten tavsiye ederim emin değilim.

+0

"Korkunç RESTENLE" yorumuna katılıyorum. @Michael, niyetinizi doğru alırsam, kullanıcı arayüzünü geliştirmek ve soruları kullanıcı formunda yerinde düzenlemeye izin vermek istiyorsunuz. Bunu yaparsanız, muhtemelen bir sonraki mantıksal adımı yapmak ve UsersController # update yöntemindeki soruları kaydetmek/doğrulamak mantıklıdır. QuestionsController'ı tamamen bırakın ve UsersController'ın her iki modelle de ilgilenmesine izin verin - Kullanıcı ve Soru. – moonfly

İlgili konular