raylar - Geliştirme - İşleme - devise_error_messages


125

kullanıcı düzenleme sayfamda aşağıdaki gibi bir satır var:

<%= devise_error_messages! %>

Sorun, uygulamanın geri kalanının yaptığı standart yolun hata vermemesidir:

<% flash.each do |key, value| %>
    <div class="flash <%= key %>"><%= value %></div>
<% end %>

Sorum şu, tasarlama hata mesajının flash.each kullanan diğerleri gibi çalışmasını nasıl sağlayabilirim?

Teşekkürler.


1
Lütfen Devise'ın, uygulamanın geri kalanının yaptığı gibi flaşı kullandığını unutmayın. devise_error_messages flaş mesajlarla (son sayfadaki bilgiler) değil, ActiveRecord Doğrulama kılavuzlarından
Christopher Oezbek

Yanıtlar:


135

Bunu kendim çözmeye çalışıyorum. Bu sorunun Github'da kaydedildiğini buldum https://github.com/plataformatec/devise/issues/issue/504/#comment_574788

Jose, devise_error_messsages!yöntemin sadece bir saplama olduğunu (uygulama içermesine rağmen) ve onu geçersiz kılmamız / değiştirmemiz gerektiğini söylüyor. Bunun wikide bir yerde belirtilmesi güzel olurdu, bu yüzden sanırım bizim gibi tahmin yürüten birkaç kişi var.

Bu yüzden, modülü yeniden açmayı ve yöntemi yeniden tanımlamayı deneyeceğim, etkin bir şekilde varsayılan uygulamayı geçersiz kılacağım. Nasıl gittiğini sana bildireceğim.

Güncelleme

Evet, işe yarıyor. Bunu şöyle yarattım app/helpers/devise_helper.rbve geçersiz kıldım:

module DeviseHelper
  def devise_error_messages!
    'KABOOM!'
  end
end

Bunu bilerek, hata mesajlarını istediğim şekilde görüntülemek için yöntemi değiştirebilirim.

Orijinal probleminizi çözmenize yardımcı olmak için: İşte devise_helper.rbGithub'daki orijinal . Hata mesajlarının nasıl geçildiğine bir göz atın:

messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join

Bu, başlamanıza yardımcı olacaktır. :)

Başka bir güncelleme

resourceNesne aslında vasiyet (go şekil) tarafından kullanılmakta olan bir modeldir.

resource.class         #=> User
resource.errors.class  #=> ActiveModel::Error

Aynı zamanda daha yüksek bir kapsamda tanımlanmış gibi görünmektedir (muhtemelen kontrol cihazından gelmektedir), bu nedenle çeşitli yerlerden erişilebilir.

Yardımcınızın herhangi bir yerinde

module DeviseHelper
  def devise_error_messages1!
    resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join
  end

  def devise_error_messages2!
    resource.errors.full_messages.map { |msg| content_tag(:p, msg) }.join
  end
end

Senin açından

<div><%= resource.errors.inspect %></div>

Bunu daha yeni denedim ama bu işe yaramıyor. Amaç, hatanın buradan çıktısını almaktır: <% flash.each do | key, value | %>
AnApprentice

@ColdTree hayır, amaç flash mesajlar gibi çalışması . İşaretlemeyi kontrol edebilmek iyi bir çözümdür.
Benjamin Atkin

... İyi bir araştırma çalışması olmasına rağmen bunun soruyu yanıtladığını sanmıyorum.
2013

37

Aşağıdaki çözüm şu andan itibaren (4.1.1) ve Rails 4.2.6 itibariyle en son tasarımla çalışır. Ama o kadar basit ki bundan 10 yıl sonra neden işe yaramayacağını anlamıyorum;)

Hata mesajlarınızı geri dönüştürmek ve uygulamanızda aynı görünmelerini istiyorsanız, buna benzer bir şey tavsiye ederim (Michael Hartl tut ile öğrendiğim yol):

Hata mesajları için kısmi oluşturun: layouts/_error_messages.html.erb Aşağıdaki kodu girin (burada bazı bootstrap 3 sınıflarını kullanıyorum):

<% if object.errors.any? %>
  <div id="error_explanation">
    <div class="alert alert-danger alert-dismissable">
      <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
      <p><strong>This form contains <%= pluralize(object.errors.count, 'error') %>.</strong></p>
      <ul>
        <% object.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
  </div>
<% end %>

Artık geri dönüştürülebilir bir şeyiniz var ve bunu her yerde kullanabilirsiniz. Standart tasarım yerine:

<%= devise_error_messages! %>

Bunu şu şekilde formunuzda arayın:

<%= render 'layouts/error_messages', object: resource %>

Herhangi bir biçimde koyabilirsiniz. Devise kaynağını iletmek yerine, formunuzdan aşağıdaki gibi değişken geçirebilirsiniz:

<%= form_for @post do |f| %>
  <%= render 'layouts/error_messages', object: f.object %>  
  <%= f.text_field :content %>
  <%= f.submit %>
<% end %>

1
Muhtemelen şimdiye kadarki en iyi ve en sezgisel cevap.
Victor

2
Harika çözüm. pluralize (object.errors.count, 'errors' çoğullaştırılacak şekilde değiştirilmelidir (object.errors.count, 'error' yine de
mizurnix

1
@LukaszMuzyka bu çözümde .. kaldırmam gerekiyor mu: user.rb'den doğrulanabilir .. ???
Vishal

1
@Vishal - hayır. Çözelti basitçe iletilerini görüntülemek için farklı HTML kullanır Üstü geliştirmektedirler herhangi mekaniğini değişmez
Lukasz Muzyka

1
@Vishal, devise'ı kullanırken, bahsettiğiniz doğrulamaları herhangi bir ekstra kod olmadan zaten yapıyor. Yukarıdaki çözüm, yalnızca varsayılan düzenleme davranışını geçersiz kılmaktır. Her şeyden önce çalışmayı planlamanız gerekir. Projenizi projenize entegre etmek için talimatları uyguladığınızdan emin misiniz?
Lukasz Muzyka

22

Bu sorunun gönderilmesinden bu yana uzun zaman geçtiğini biliyorum, ancak bulduğum şey hakkında yorum yapmak istedim. Zaten cevap veren iki kişi bana çok yardımcı oldu ve ben sadece katkıda bulunmak istedim.

Devise boyunca kullanılan aramaların olduğunu göreceksiniz render_with_scope. Bunun tasarı tarafından tanımlanan bir yöntem olduğuna ve temelde mevcut kapsamı işlenen bir sonraki görünüme uyguladığına inanıyorum.

Bu neden alakalı? Devise, içinde resource.errors( değil @resource.errors ) hatalarınızı içerir . Tabiri caizse, onu kutusundan çıkarıp kullanmak istiyorsanız, Devise iyi çalışıyor.

Kullanıcı yönetimi davranışınızı değiştirmeye başlarsanız bu hatalarla ilgili sorunlar ortaya çıkar. Devise'ın daha önce sahip olmadığı bir redirect_toveya render(yerine render_with_scope) ekleyerek , temelde hata mesajlarını atarsınız. Bu, bence Devise'ı değişikliğe karşı düşmanca kılıyor.

Benim çözümüm bu

# In application.html.erb
<% flash.each do |name, msg| %>

  # New code (allow for flash elements to be arrays)
  <% if msg.class == Array %>
    <% msg.each do |message| %>
      <%= content_tag :div, message, :id => "flash_#{name}" %>
    <% end %>
  <% else %>

    # old code
    <%= content_tag :div, msg, :id => "flash_#{name}" %>

  <% end %> #don't forget the extra end
<% end %>

ve

# Wherever you want Devise's error messages to be handled like 
# your other error messages
# (in my case, registrations_controller.rb, a custom controller)
flash[:notice] = flash[:notice].to_a.concat resource.errors.full_messages

İkinci kod bloğu, Devise'ın hata mesajlarını bir dizi olarak alır ve onu flash[:notice](bir dizi olarak) içine ekler . Her mesaj bir seferde bir satır yazdırılacaktır. Vaktim varsa, iki yerine tek bir hata mesajı sistemine sahip olmak çok daha temiz göründüğü için Devise'ın bunu uygulamam boyunca yapmak için hata mesajlarını nasıl işleyeceğini değiştireceğimi düşünüyorum.


3
Bunun için çok teşekkür ederim, bunu yapmaya çalıştığım için kafamı duvara vuruyordum.
Lucas

1
Şimdi 5 yıl sonra ve bu cevap pastırmamı kurtardı. Çok teşekkürler @ eric-hu.
marcamillion

12

Bunu YoyoS'a benzer şekilde bir oluşturup içine app/helpers/devise_helper.rbyerleştirerek çözdüm :

module DeviseHelper

  # Hacky way to translate devise error messages into devise flash error messages
  def devise_error_messages!
    if resource.errors.full_messages.any?
        flash.now[:error] = resource.errors.full_messages.join(' & ')
    end
    return ''
  end
end

Yaradı!


11

Buraya yeni bir küçük parça getirmek istiyorum:

Bu yüzden, "Bir Uygulama" nın istediği sonucu elde etmenin daha kolay bir yolunu buldum.

Öncelikle, Devise eklentisi içinde herhangi bir şeyi özelleştirmek istiyorsanız, "\ Ruby_repertory \ lib \ ruby ​​\ gems \ 1.9.1 \ gems \ devise-version \ app \ controllers'daki kodu kopyalamanızı şiddetle tavsiye ederim. | yardımcılar | postacılar ... "projenizde istediğiniz dosyaya.

[Düzenle] Veya dosyanızı "normal" düzenlenmiş dosyalardan devralmasını sağlayabilirsiniz ... Mesela ... Diyelim ki ... Kullanıcılarınızın ilk satırı olan devise / registrations_controller.rb içinde yalnızca bir işlevin üzerine yazmak istiyorsunuz kayıt denetleyicisi:

class Users::RegistrationsController < Devise::RegistrationsController

[Düzenleme 7 Ağustos 2013] Now Devise, denetleyiciler oluşturmak için bir araç bile sağlıyor: https://github.com/plataformatec/devise/wiki/Tool:-Generate-and-customize-controllers

Yani ... her neyse ... "AnApprentice" in sadece bunu yazarken istediği şeyi almayı başardım (daha temiz bir çözüm için, aşağıdaki büyük düzenlemeye bakın):

#/my_project/app/helpers/devise_helper.rb
module DeviseHelper
   def devise_error_messages!
      return "" if resource.errors.empty?

      return resource.errors
   end
end

Ve benim görüşüme göre, sonraki satırlar oldukça iyi çalıştı:

<% devise_error_messages!.each do |key, value| %>
    <div class="flash <%= key %>"><%= key %> <%= value %></div>
<% end %>

Peki ... o zaman bunun gibi belirli bir öznitelik için hatalara erişebilirsiniz:

    #Imagine you want only the first error to show up for the login attribute:
    <%= devise_error_messages![:login].first %> 

Ve ... Her özellik için yalnızca bir hatanın (ilk yakalanan) görünmesi için küçük bir numara:

<% if resource.errors.any? %>
  <% saved_key = "" %>
  <% devise_error_messages!.each do |key, value| %>
    <% if key != saved_key %>
        <div class="flash <%= key %>"><%= key %> <%= value %></div>
    <% end %>
    <% saved_key = key %>
  <% end %>
<% end %>

Bu sorunun gönderilmesinden bu yana epey zaman geçtiğini biliyorum, ancak bunun pek çok kullanıcı için faydalı olacağını düşünüyorum :).

Büyük Düzenleme:

Kodumu genişletmeyi, daha temiz hale getirmeyi ve başkalarıyla paylaşmayı sevdiğim için, son zamanlarda devise_error_message'ları değiştirmek istedim! yöntemini kendi görüşlerimde kullanmak ve yukarıda anlattığım hileyi göstermesini sağlamak için.

İşte benim yöntemim:

 def devise_error_messages! 
    html = ""

    return html if resource.errors.empty?

    errors_number = 0 

    html << "<ul class=\"#{resource_name}_errors_list\">"

    saved_key = ""
    resource.errors.each do |key, value|
      if key != saved_key
        html << "<li class=\"#{key} error\"> This #{key} #{value} </li>"
        errors_number += 1
      end
      saved_key = key
    end

    unsolved_errors = pluralize(errors_number, "unsolved error")
    html = "<h2 class=\"#{resource_name}_errors_title\"> You have #{unsolved_errors} </h2>" + html
    html << "</ul>"

    return html.html_safe
 end

Burada önemli değil, kendi görüşüme göre yazdığım kodu yalnızca bir hata pey özniteliğini göstermek için yeniden kullandım, çünkü genellikle ilk olan tek alakalı olandır (kullanıcının bir gerekli alanı unutması gibi).

Bu "benzersiz" hataları sayıyorum ve çoğullaştırmayı kullanarak bir H2 HTML başlığı yapıyorum ve bunu hata listesinden ÖNCE koyuyorum.

Şimdi, "devise_error_messages!" varsayılan olarak ve daha önce zaten oluşturduğum şeyi tam olarak işliyor.

Görünümünüzde belirli bir hata mesajına erişmek istiyorsanız, şimdi doğrudan "resource.errors [: öznitelik] .first" veya başka bir şey kullanmanızı tavsiye ederim.

Seya, Kulgar.


6

Rails 3'te Devise kullanıyorum ve flash kodunuz sahip olduğumla hemen hemen aynı. Uygulamamda kod beklendiği gibi çalışıyor; ör. Devise hata mesajları, flash mesajlarımın geri kalanıyla birlikte çıktı:

<% flash.each do |name, msg| %>
  <%= content_tag :div, msg, :id => "flash_#{name}" if msg.is_a?(String) %>
<% end %>

Tam olarak bu kodu deneyin ve herhangi bir fark yaratıp yaratmadığına bakın - farklı kimlik özelliği yardımcı olabilir.


teşekkürler ama bu hiçbir şey göstermiyor. "<% = devise_error_messages!%>" bir hata veriyor. yukarıdaki hiçbir şey yapmadı mı? fikir?
AnApprentice

Özür dilerim - Yorumunuzu sadece yeni gördüm.Dürüst olmak gerekirse, fikirlerim tükeniyor. Tarayıcınızda kaynağı görüntülediğinizi ve oluşturulan HTML'yi kontrol ettiğinizi varsayıyorum. Bir şeyin CSS tarafından gizlenmesi ihtimaline karşı. Devise 1.1.3'ün en son sürümünü mü kullanıyorsunuz?
Scott

5

Ben buna geldim ve şu ana kadar çalışıyor. Bu, flaşa tasarlama mesajları ekler, böylece her zamanki gibi kullanılabilir. Lütfen Ruby and Rails'de yeni olduğumu düşünün ...

class ApplicationController < ActionController::Base
  after_filter :set_devise_flash_messages, :if => :devise_controller?
  ...

  private:

  def set_devise_flash_messages
    if resource.errors.any?
      flash[:error] = flash[:error].to_a.concat resource.errors.full_messages
      flash[:error].uniq!
    end
  end
end

Düzenle:

Üzgünüm nöbet tutuyordum ve bazı istenmeyen davranışlar vardı. Yana after_filterrender sonra denir beklendiği gibi çalışmıyor bu yüzden. Birisi eylemden sonra ancak oluşturmadan önce bir yöntemi nasıl çağıracağını biliyorsa ...

Ancak bunun yerine bunun gibi bir şey kullanabilirsiniz:

module ApplicationHelper

  # merge the devise messages with the normal flash messages
  def devise_flash
    if controller.devise_controller? && resource.errors.any?
      flash.now[:error] = flash[:error].to_a.concat resource.errors.full_messages
      flash.now[:error].uniq!
    end
  end

end

İçinde views/shared/_messages.html.erb

<% devise_flash %>
<!-- then display your flash messages as before -->

1
+1 Harika cevap. Bunun kesinlikle en temiz çözüm olduğunu ve mevcut mimarime çok iyi uyduğunu düşünüyorum. Yine de cevap o kadar net değil - temelde düzenlemeden önceki her şey göz ardı edilmeli (ve imo aracılığıyla kaldırılmalı veya vurulmalıdır).
zelanix

3

Belirli bir türde (: alert,: notice, vb.) Birden fazla flaş görüntüleyebilmek ve bir mücevher davranışını değiştirmeye çalışmakla zamanınızı boşa harcamamak istiyorsanız, bu Devise ile kullandığım çözümdür. Flash mesaj kullanan herhangi bir mücevher ile kullanılabileceğinden oldukça eminim.

Yapmanız gereken ilk şey, application_controller.rb dosyanıza şunu ekleyin:

  # Adds the posibility to have more than one flash of a given type
  def flash_message(type, text)
    flash[type] ||= []
    flash[type] << text
  end

Yapmanız gereken ikinci şey, flash mesajlarınızı bununla application.html.erb'de (veya istediğiniz yerde) görüntülemek:

   <div class="flashes">
      <% flash.each do |key, messages| %>
        <% messages = Array(messages) unless messages.is_a?(Array) %>
        <% messages.each do |message| %>
        <div class="alert alert-<%= key %>">
          <%= message %>
        </div>
        <% end %>
      <% end %>
    </div>

Yapmanız gereken üçüncü şey, herhangi bir denetleyiciye bir flash mesaj eklemek istediğinizde şunu yapın:

flash_message(:success, "The user XYZ has been created successfully.")

Ancak Devise mesajlarının bir hata nesnesi tutmak yerine flash_messages'ı çağırması nasıl sağlanır.
Christopher Oezbek

3

DeviseHelper oluşturun:

module DeviseHelper
  def devise_error_messages!
    return "" if resource.errors.empty?

    messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg)}.join
    return flash.now[:alert] = messages.html_safe
  end
end

Size göre ikame

<%= devise_error_messages! %>

Kime:

<% devise_error_messages! %>

1
Aslında şunu kullanmalısınız: flash.now [: alert]
BM

2

Kuşkusuz, biraz hilekar, ancak bu yardımcıyı (app / helpers / devise_helper.rb) flaşları yakalamak ve daha sonra varsayılan olarak ayarlanmışsa bunları kullanmak için kullanıyorum resource.errors. Bu sadece lib dizisindeki yardımcıya dayanmaktadır.

module DeviseHelper

  def devise_error_messages!
    flash_alerts = []
    error_key = 'errors.messages.not_saved'

    if !flash.empty?
      flash_alerts.push(flash[:error]) if flash[:error]
      flash_alerts.push(flash[:alert]) if flash[:alert]
      flash_alerts.push(flash[:notice]) if flash[:notice]
      error_key = 'devise.failure.invalid'
    end

    return "" if resource.errors.empty? && flash_alerts.empty?
    errors = resource.errors.empty? ? flash_alerts : resource.errors.full_messages

    messages = errors.map { |msg| content_tag(:li, msg) }.join
    sentence = I18n.t(error_key, :count    => errors.count,
                                 :resource => resource.class.model_name.human.downcase)

    html = <<-HTML
    <div id="error_explanation">
      <h2>#{sentence}</h2>
      <ul>#{messages}</ul>
    </div>
    HTML

    html.html_safe
  end

end

2

Devise_error_messages'dan bindirme yapmak istiyorsanız, bunu resource.errors'a ekleyerek yapabilirsiniz.

Kayıt denetleyicisini aşacak olsaydınız, şöyle görünebilir

def create
  if validation_or_other_check_passes
    super
  else
    build_resource
    clean_up_passwords(resource)
    resource.errors.add(:notice, "The check failed.")
    render :new 

2

Her alan için hata mesajı görüntülemenin çok kolay yolu

<%= resource.errors.messages[:email].join(" ") %>

satır içi hata mesajını görüntülemek istediğiniz her satırın altına köşeli parantez içinde alan adı olan her alan için koyun.


1

Yalnızca ilk hata gösterilerek kontrol cihazınızdan gelen geliştirme hatasını göstermek için.

flash[:error] = @resource.errors.full_messages.first

1

Tüm If ifadelerinin kullanıldığı yukarıdaki Eric Hu yanıtına eklemek için bunun yerine bunun gibi bir şey yapın.

# Controller
flash.now[:error] = flash[:error].to_a.concat(resource.errors.full_messages)

# View
<% flash.each do |name, msg| %>
 <% Array(msg).uniq.each do |message| %>
  <%= message %>
 <% end %>
<% end %>

1

basitçe bunu yapıyorum, benim için çalıştı: app / helpers / içinde bir dosya oluşturuyorum devise_helper.rb

  module DeviseHelper

  def devise_error_messages_for(resource)
    return "" if resource.errors.empty?

    messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join
    sentence = I18n.t("errors.messages.not_saved",
                      count: resource.errors.count,
                      resource: resource.class.model_name.human.downcase)

    html = <<-HTML
    <div id="error_explanation">
      <h2>#{sentence}</h2>
      <ul>#{messages}</ul>
    </div>
    HTML

    html.html_safe
  end
end

tüm görünüm dosyalarında değiştiririm

<%= devise_error_messages! %>

için:

<%= devise_error_messages_for(#your object in your formular)%>

benim için benim görüşüme göre düzenleme ve yeni kullanıcı:

  <%=form_for resource, as: @user, url: user_path(@user),...
      <%= devise_error_messages_for(@user) %>

umarım size yardımcı olur;)


Bunun nasıl bir şey yaptığını gerçekten anlamıyorum? bu standart davranış mı? Bu sadece yapmanın başka bir yolu <%= devise_error_messages! %>ve soruyu cevaplamıyor. Soru, her mesaja nasıl flash uygulanacağını sorar.
Mark

0
  1. "Devise_error_messages!" "uygulama / görünümler / kullanıcılar / şifreler / yeni" şablonundan.
  2. Kullanıcınız için özel denetleyici oluşturun (uygulama / denetleyiciler / kullanıcılar / passwords_controller.rb) ve bir sonra filtrede hata ekleme flash dizisi:
class Users::PasswordsController < Devise::PasswordsController
  after_filter :flash_errors

  def flash_errors
    unless resource.errors.empty?
      flash[:error] = resource.errors.full_messages.join(", ")
    end
  end
end

0

Bu hile ile diğer Devise denetleyicisinde yapıldığı gibi yapmayı seviyorum.

<% if flash.count > 0 %>
  <div id="error_explanation">
    <h2>Errors prevented you from logging in</h2>
      <ul>
        <% flash.each do |name, msg| %>
        <li>
          <%= content_tag :div, msg, id: "flash_#{name}" %>
        </li>
       <% end %>
     </ul>
   </div>
<% end %>

0

Materialisecss'in hata mesajlarını tost olarak görüntülemesi için bu kodu app / helpers / devise_helper.rb içine ekledim

module DeviseHelper
  def devise_error_messages!

    messages = resource.errors.full_messages.map { |msg|
      String.new(" M.toast({html: '" + msg + "' }); ".html_safe )
    }.join

    messages = ("<script>" + messages + "</script>").html_safe
  end 
end

Eminim onları yazmanın en temiz yolu olurdu ama mükemmel uyanıyor


0

DeviseHelper#devise_error_messages! kullanımdan kaldırıldı ve bir sonraki ana sürümde kaldırılacak.

Devise artık devise/shared/error_messageshata mesajlarını varsayılan olarak görüntülemek için kısmi bir under kullanıyor ve bunların özelleştirilmesini kolaylaştırıyor. Görüşlerinizi aşağıdaki çağrılardan değiştirerek güncelleyin:

      <%= devise_error_messages! %>

için:

      <%= render "devise/shared/error_messages", resource: resource %>

-1

app/helpers/devise_helper.rbBenzer bir John yarattım ama yöntemi şu şekilde geçersiz kıldım:

module DeviseHelper
  def devise_error_messages!
    flash[:error] = resource.errors.full_messages.join('<br />')
    return ''
  end
end

Bununla başka hiçbir şeyi değiştirmem gerekmiyor. Bu kötü bir fikir mi? Raylarda yeniyim, beni düzeltmekten çekinmeyin. Teşekkürler.


Bu istendiği gibi çalışmaz, flash mesaj artık html etiketi içeriyor <br>. Normalde flaş mesajınıza sadece bir dizi koyarsınız.
AZ.

Belki, ama yeni çizgi hala çalışıyor. Bunu beğenmediyseniz başka bir çözüm önerin.
YoyoS

-2

Az önce devise_error_messages ilan ettim! boş bir yardımcı olarak. Ve uygulamam için genel _errors kısmındaki hataları manuel olarak getirip işledim. En basit çözüm gibi görünüyordu ve tüm aygıt dosyalarına bakmam ve hata işleyiciye yapılan çağrıyı kaldırmam gerekmiyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.