2012-03-29 21 views
5

Bu yüzden mantığı "çizilmeye karşı" kimlik doğrulamasında http://railscasts.com/episodes/250-authentication-from-scratch adresinde kullandım ve işe yaramış gibi görünüyor ve "Oturum açtınız ..." iletisini yapıştırabilirim sayfanın üst kısmı.Geçerli kullanıcı Ruby on Rails'e başvuruyor

Ama bir yazı gönderen günlük gibi bir şey yapmak istersem, bir duvara biraz vurdum.

Yeni posta formundaki gizli bir alandan göndermek istemiyorum, çünkü bununla ilgili güvenlik sorunları olduğunu tahmin ediyorum.

http://ruby.railstutorial.org/ruby-on-rails-tutorial-book adresindeki kılavuzlardaki "aittir" mantığını kullanmak istemiyorum çünkü teknik olarak burada işe yarayacak olsa da, gelecekte kimin "ait olduğu" ilişkisini kimin oluşturduğu giriş yapmalıyım mevcut değil.

Yapmaya çalıştığım, "model_ad" değeri atayan posta modelimde "kaydetmeden önce" bir işlev çağrısı oluşturmaktı, ancak sanırım modeller kimlik doğrulaması dağıtım sitesine göre oluşturulan current_user öğesine erişemiyor.

Şimdi böyle bir şeyin nasıl yapılacağını bilmiyorum.

DÜZENLEME: Ruby'den yeni, ERD'ye yeni, tüm bunlar, ama ilişkinin ait olduğu anlamına gelmediğim şey, eğer yayınlar için bir derecelendirme sistemi olsaydı, her bir derecelendirme bir gönderiye ait olurdu . Ancak, her bir notu kimin gönderdiğine de giriş yapmak istiyorum. Burada

+0

bu ekstresinde genişletilebilir:

def new_post(params) post = Post.new(params) post.created_by = id post end 

ve denetleyici içinde

?"Gelecekte," ait olan "ilişkinin bulunmadığı bir girişi kimin yarattığını kaydetmem gerekebilir." – James

+0

http://stackoverflow.com/questions/1568218/access-to-current-user-from-within-a-model-in-ruby-on-rails http://stackoverflow.com/questions/2513383/access- Şu anki kullanıcı modeli –

cevap

7

, sadece Post denetleyicisi konusu yayının created_by niteliğini ayarlayabilirsiniz o, gibi bir şey:

def create 
    @post = Post.new(params[:post]) 
    @post.created_by = current_user.id 
    if @post.save 
    redirect_to whereyouwant_url, :notice => "Post successfully created" 
    else 
    render "new" 
    end 
end 
+0

Teşekkürler, bunun gibi bir şeyden şüphe duydum, belki de daha önce bunun bir örneği görüldü, ama Raylar biraz şimdiye kadar ezici. Tam olarak ihtiyacım olan şey bu. Güncelleme sırasında – user1299656

+0

, bunu geçmek zorundayız? bcoz created_by dosyası güncellenirken kaldırılıyor ... :( –

0
Tamam

değil bulunduğuna bakın komplikasyonlar emin, ama gider:

böylece kullanıcının kimliği için yabancı bir anahtardır user_id adlı bir alan bir belongs_to yazı yapar Addind. Eğer bir yaratılmış eklemiş olsaydınız, bu aynı şeyi yapardı, ancak güncelleme ve derefreeces'i kendiniz programlamanız gerekecekti. Bunun muhtemelen bu işlevselliği elde etmenin en iyi yolu olduğunu düşünüyorum ve bunu daha sonra parçalara sahip olmayan parçalara eklemelisiniz, ancak raylar bunu kolaylaştırıyor.

class User < ActiveRecord::Base 
    has_many :posts 
end 

class Post < ActiveRecord::Base 
    belongs_to :user, :as => :created_by 
end 



post.created_by 
user.posts 

o kullanıcıya erişim sunar ve bu sihrini ve sizin için yöntemler eklersiniz raylar hariç, sen konuştuğumuz şeyi kullanarak eşdeğerdir olduğunu ederim.

DÜZENLEME: eğer bu sizin için işe yaramazsa, üzgünüz sorusu neden belirli şeylere ihtiyaç duyduğunuz konusunda net değildi, ancak her zaman ilişkiye ait olanları çok kolay ekleyebilirsin, bunu tavsiye ederim. kaydetmek için önce ben de sahip sorun şu anda modelinde current_user yardımcı yöntemi kullanılarak loggen hangi kullanıcı göremiyorum gerçektir anlıyorsanız

+0

Teknik olarak işe yarayacak ve bununla ilgili herhangi bir sorunum olmadı. Benim endişem şu ki, başka alanlarda birden fazla yabancı anahtara ihtiyacım varsa bu bir sorun olacaktır. Örneğin, derecelendirme notlarım varsa, her bir derecelendirmenin bir gönderiye ait olmasını isterdim, ancak her birini gönderen bir günlüğünü de isterim. Birden fazla "aittir" ilişkisine sahip olmak ve her iki yabancı anahtarı da bu şekilde doldurmak mümkün mü? Anladığım kadarıyla – user1299656

+0

, işe yarayacak. 4 ait ve 2 has_manys'e sahip modellerim var, sadece daha fazla sütun eklediniz, post_id, submitter_id, rating_id, vb. – loosecannon

0

(Aldo 'Xoen' Giambelluca cevap alternatif) Ben Loosecannon tarafından açıklandığı şekilde bir belongs_to ilişkiyi kullanmak gerektiğini düşünüyorum, ama sen gerçekten istemiyorsanız

, eklemek senin User sınıfında aşağıdaki yöntemi:

def create 
    @post = current_user.new_post(params[:post]) 
    if @post.save 
    redirect_to @post, notice: 'Post successfully created' 
    else 
    render 'new' 
    end 
end