2016-03-23 22 views
2

Rails'de kullanıcıların resim yüklemelerine izin veren temel bir fotoğraf galerisi sitesi geliştiriyorum. Kullanıcı kimlik doğrulaması için Devise kullanıyorum. Görüntü modelimin, bir kullanıcının yüklendiği sırada geçerli kullanıcının kimliğinin kaydedildiği bir alan vardır.Raylar - ActiveRecord veritabanı sorgusunda current_user.id kullanın

İşte denetleyicisi yöntemi oluşturmak var:

def create 
     @image = Image.new(image_params) 
     @image.uid = current_user.id 
     if @image.save 
      redirect_to @image 
     end 
     end 

Sonra görünümünde ben uid geçerli kullanıcının kimliğiyle eşleşen hangi veritabanında tüm görüntüleri almak istiyorum (yani akımın bütün görüntüler kullanıcının görüntüleri). Şu anda var: Böyle current_user.id sadece nil döndürmesi nedeniyle

<% Image.where("uid == current_user.id") do |image|%> 
      <div class="col-lg-3 col-md-4 col-xs-6 thumb"> 
       <a class="thumbnail" href="#"> 
        <!--<img class="img-responsive" src="<%image.image_url%>" alt="">--> 
        <%= image_tag image.image_url(:thumb) %> 
       </a> 
      </div> 
      <% end %> 

Ancak hiçbir görüntü sergilenmektedir sanırım.

ActiveRecord veritabanını current_user.id değerini kullanarak sorgulamak mümkün mü?

cevap

4

Kişisel sözdizimi sadece Yapmaya çalıştığınız şey için kapalıdır:

<% images = Image.where("uid =?", current_user.id) %> 

Sonra sadece filmindeki gibi bir parametreli sorgu .each

+0

Mükemmel! Bunu bir parametre ile denedim, ancak sonuçların içinden geçecek bir diziye atamak zorunda olduğunun farkında değildim. Teşekkürler! –

+1

@AdamLazarus Bunları bir diziye atamanız gerekmez. Todd'un burada gösterdiği şey, current_user.id'de düzgün bir şekilde nasıl geçeceğidir. Örneğinizde, bir dizge olarak kod yazdınız, bu nedenle sorgunuz, "uid" in "current_user.id" 'dizgesine eşit olduğu kayıtları bulmaya çalışıyor. Geçerli kodunuz, bir değişkene ilk önce atamadan çalışacaktır, aksi halde '' '' '' 'argümanlar bu gibi görünür -' 'uid =?', Current_user.id' (Todd'un işaret ettiği gibi) ya da bunun gibi - "" uid = # {current_user.id} "'. Todd's gitmek için en iyi yoldur çünkü SQL Injection'dan korur. – jeffdill2

1

ile görüntüleri ile döngü kullanabilirsiniz çıkarabilirler @ toddmetheny mükemmel Birbirine bağlantı kayıt işlemek için çok daha iyi bir geleneksel raylar yol cevap.

sütununu yeniden adlandır user_id. Bu, ActiveRecord ilişkilerini çok az yapılandırma ile kullanmanıza olanak tanır. bir demet set yok demek için güzel bir yol gibi tür olduğunu -

uid

yüzden az sürpriz ait ilkesini ihlal da unique identifier için ortak bir kısaltma sonra yabancı bir anahtar sütun için kötü bir isim seçimdir Zavallı ruhun tuzağına düşeni kodunuzu kullanmak zorunda.

class RenameImagesUidToUserId < ActiveRecord::Migration 
    def change 
    rename_column :images, :uid, :user_id 
    end 
end  

Ardından kurulum iki model arasında bir ilişki:

class User < ActiveRecord::Base 
    has_many :images 
end 

class Image ActiveRecord::Base 
    belongs_to :user 
end 

Bu User.find(1).images veya Images.find(1).user yapalım.

Öyle gibi ilişkili bir kayıt oluşturmak olacaktır:

def create 
    @image = current_user.images.new(image_params) 
    if @image.save 
    redirect_to @image 
    end 
end 

Sonra sadece yapabileceği Resimleri listelemek için:

<% current_user.images.each do |image| %> 
    <div class="col-lg-3 col-md-4 col-xs-6 thumb"> 
    <a class="thumbnail" href="#"> 
     <%= image_tag image.image_url(:thumb) %> 
    </a> 
    </div> 
<% end %> 
+0

Veritabanının değişmesi gerekmiyor. has_many ilişkisinde, foreign_key belirtilebilir. has_many: images, foreign_key:: uid –

+0

Yabancı anahtar seçeneğini kullanabildiğinizi çok iyi biliyorum ama 'uid' özelliğini bir sütun adı olarak kullanmanın neden kötü bir fikir olduğunu anladım. İyi bir nedeniniz olmadığı sürece, konfigürasyonu sözleşmeyi de takip etmek iyi bir fikirdir. – max

+0

İyi puanlar. Bu aslında benim ilk düşüncemdi. – toddmetheny

İlgili konular