2012-03-29 42 views
5

Vì vậy, tôi đã sử dụng logic trong "xác thực từ đầu" railscast tại http://railscasts.com/episodes/250-authentication-from-scratch và có vẻ như hoạt động và tôi có thể dán thông báo "Bạn đã đăng nhập bằng ..." Đầu trang.Tham khảo người dùng hiện tại trong Ruby on Rails

Nhưng nếu tôi muốn làm điều gì đó giống như nhật ký đã gửi một bài đăng tôi đã đánh một bức tường.

Tôi không muốn gửi thông qua trường ẩn trong biểu mẫu bài đăng mới, vì tôi đoán có vấn đề bảo mật với điều đó.

Tôi không muốn sử dụng logic "thuộc về" trong hướng dẫn đường ray tại http://ruby.railstutorial.org/ruby-on-rails-tutorial-book bởi vì mặc dù nó sẽ hoạt động ở đây, tôi có thể cần phải đăng nhập để tạo một mục nhập trong đó mối quan hệ "thuộc về" không tồn tại.

Điều tôi cố làm là tạo cuộc gọi hàm "trước khi lưu" trong mô hình bài đăng gán giá trị "created_by", nhưng tôi đoán mô hình không thể truy cập current_user được tạo theo yêu cầu xác thực.

Vì vậy, bây giờ tôi không có ý tưởng làm thế nào để làm một cái gì đó như thế này. CHỈNH SỬA: Mới với Ruby, mới cho ERD, tất cả những điều đó, nhưng điều tôi ngụ ý bởi mối quan hệ không tồn tại là nếu có, giả sử, hệ thống xếp hạng cho bài đăng, mỗi xếp hạng sẽ thuộc về bài đăng . Nhưng tôi cũng muốn đăng nhập người đã gửi từng xếp hạng.

+0

Bạn có thể mở rộng tuyên bố này?"Tôi có thể trong tương lai cần phải đăng nhập người tạo ra một mục mà mối quan hệ" thuộc về "không tồn tại." – 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- hiện tại-người dùng-trong-mô hình –

Trả lời

7

Nếu tôi hiểu tốt các vấn đề bạn có là một thực tế bạn không thể nhìn thấy mà người dùng hiện đang sử dụng phương pháp loggen current_user helper trong mô hình của bạn, bạn chỉ có thể thiết lập các thuộc tính của created_by bài trong bộ điều khiển Post trước để tiết kiệm nó, một cái gì đó như:

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

Cảm ơn, tôi nghi ngờ một cái gì đó như thế này nên có thể, thậm chí có thể nhìn thấy một ví dụ của nó trước, nhưng Rails là một chút áp đảo cho đến nay. Khá chắc chắn đây là chính xác những gì tôi cần. – user1299656

+0

trong khi cập nhật, chúng ta cần phải vượt qua điều này? bcoz i am nhận được created_by gỡ bỏ trong khi cập nhật .. :( –

0

Ok, không chắc chắn những gì phức tạp tồn tại, nhưng ở đây đi:

nên addind một belongs_to làm cho các bài có một trường gọi là user_id đó là khóa ngoại cho id của người dùng. nếu bạn thêm một tạo ra bởi, điều này sẽ làm điều tương tự, ngoại trừ bạn sẽ phải chương trình cập nhật và derefreneces chính mình. Tôi nghĩ rằng đây có lẽ là cách tốt nhất để có được chức năng này, và bạn sẽ chỉ phải thêm nó sau này vào các phần không có nó, nhưng đường ray làm cho nó dễ dàng.

class User < ActiveRecord::Base 
    has_many :posts 
end 

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



post.created_by 
user.posts 

sẽ cấp cho bạn quyền truy cập vào người dùng đó, ngoại trừ việc sử dụng những gì bạn nói, ngoại trừ đường ray sẽ thực hiện phép thuật và thêm phương pháp cho bạn.

EDIT: nếu điều này không hiệu quả với bạn, xin lỗi câu hỏi của bạn không rõ ràng tại sao bạn cần những thứ nhất định, nhưng bạn luôn có thể thêm vào mối quan hệ khá dễ dàng, đó là những gì tôi muốn giới thiệu.

+0

Về mặt kỹ thuật điều này sẽ làm việc, và tôi đã không có bất kỳ vấn đề với nó. Mối quan tâm của tôi là nếu tôi cần nhiều hơn một khóa ngoại ở các khu vực khác thì đây sẽ là một vấn đề. Ví dụ: nếu tôi có xếp hạng bài đăng, tôi sẽ cần mỗi xếp hạng thuộc về một bài đăng nhưng tôi cũng muốn có nhật ký của những người đã gửi bài đăng. Có thể có nhiều hơn một mối quan hệ "thuộc về" và điền vào cả hai khóa ngoại theo cách này? – user1299656

+0

từ những gì tôi hiểu, có mà sẽ làm việc. Tôi có mô hình với 4 thuộc về và 2 has_manys, bạn chỉ cần thêm nhiều cột, post_id, submitter_id, rating_id, v.v. – loosecannon

0

(thay thế cho câu trả lời Giambelluca Aldo 'xoen')

tôi nghĩ rằng bạn nên sử dụng một mối quan hệ belongs_to như được giải thích bởi loosecannon, nhưng nếu bạn thực sự không muốn, thêm vào các phương pháp sau đây trong lớp User của bạn:

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

và trong điều khiển của bạn:

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