0

Ürün oluşturmak için bir formum var. Bir ürün doğrulamalarla pek çok alana sahiptir. Örneğin:Form alanı başına raylar geçerlilik hatası

  • Adı:
  • Açıklama:
  • Renkler:
  • Boyutu:
  • Mevcut Miktarları:

Say kullanıcı boş formu kurtarmaya çalıştı. Üstte general hatayı gösterebilir (varsa) ya da sadece ilgili alana yukarıda hatayı gösterme mümkün olacağını Yani

{ 
    general: 'Something went wrong, Please contact support team.' 
    product: { 
    name: 'Name can not be blank', 
    description: 'Description can not be blank' 
    } 
} 

: Şimdi hata karma tür aşağıdaki göstermek zorunda istiyorum. products_controller yılında

,

def create 
    @product = Product.new(product_params) # Strong params 
    if @product.save 
     flash[:success] = "Welcome to the Sample App!" 
     redirect_to @product 
    else 
     render 'new' 
    end 
    end 

nasıl hata her alana karşılık gelen gösteriyor? @product.errors'un hata vereceğinin farkındayım. Ama ben de bir general hata anahtarını tutmak istiyorum. flash, bunu yapmanın bir yoludur. Ama bildiğim kadarıyla, bir flaşta sadece kısa mesaj gönderebiliriz. Rails'de doğru yol ne olmalı?

sayesinde

cevap

1

İşte bu sorunun benim çözümdür. Alan başına görünümde kullandığım basit bir yardımcı yöntem oluşturdum. Oldukça uzatılabilir, bu yüzden şu anki haliyle sınırlı hissetmeyin. Kolayca iletilerin karma için başka tuşa general ekleyebilir, vb Bununla

# app/helpers/form_errors_helper.rb 
module FormErrorsHelper 
    def error_message_on(object, method) 
    return unless object.respond_to?(:errors) && object.errors.include?(method) 
    errors = field_errors(object, method).join(', ') 

    content_tag(:div, errors, class: 'form-group-error') 
    end 

    private 

    def field_errors(object, method) 
    object.errors[method] 
    end 
end 

# css 
.form-group-error { 
    # your styling here 
} 

# form 
<%= form_for(@product) do |f| %> 
    <div class="form-group"> 
    <%= f.label(:name) %> 
    <%= f.text_field(:name) %> 
    <%= error_message_on(f.object, :name) %> 
    </div> 

    <div class="form-group"> 
    <%= f.label(:description) %> 
    <%= f.text_area(:description) %> 
    <%= error_message_on(f.object, :description) %> 
    </div> 
<% end %> 

, özel CSS sınıfları eklemek edebilmek için ek argümanlar/seçeneklere kabul edebilir.

Modelinizde bunu yaptığınızı varsayalım.

errors.add(:general, 'This is my general error') 

Öyleyse, görünümünüzde, yalnızca aynı yardımcıyı kullanırsınız. Eğer "genel" hata için farklı stil gerekiyorsa

error_message_on(f.object, :general) 

, ek CSS sınıfları gibi, bu yardımcı için ek argüman olarak geçebilir.

+0

Anlam ifade eder. Teşekkürler. – Indyarocks

+0

siz @Indyarocks'a hoş geldiniz. Şerefe. –

0

Basitçe size html.erb dosyasında <%=f.error_span(:name) %> kullanabilirsiniz

Örnek:

<div class="form-group"> 
    <%= f.label(:name) %> 
    <%= f.text_field(:name) %> 
    <%=f.error_span(:name) %> 
</div> 

Not: Bu çalışma ve validasyonlar kolay hale getirecek için Sen twitter-önyükleme-raylar taş gerek tüm sayfalar için. İhtiyacın olan şey buysa, haberim olsun!

+0

Neredeyse tam olarak cevapladığım şeyi yapıyorlar ... haha ​​https://github.com/seyhunak/twitter-bootstrap-rails/blob/c6893c3db02108bcdee7f8f333531b99806779ac/app/helpers/form_errors_helper.rb –