2011-12-12 22 views
9

Tôi đang thực hành Ruby on Rails bằng cách tạo một ứng dụng đơn giản, nơi người dùng có thể đăng ký (sử dụng Devise) và đăng các bài viết.Làm thế nào để vượt qua current_user của Devise như user_id?

Sau khi cài đặt lập mưu, tôi đi trước và tạo ra một giàn giáo cho các bài viết

rails g scaffold article title:string article:text user_id:integer 

Sau đó, tôi tạo ra bộ điều khiển sử dụng lập mưu

rails generate devise User 

điều khiển Bài viết của tôi:

class Article < ActiveRecord::Base 
    belongs_to :user 
end 

Trình điều khiển người dùng của tôi:

class User < ActiveRecord::Base 
    has_many :articles 

    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    attr_accessible :email, :password, :password_confirmation, :remember_me 
end 

Bây giờ câu hỏi của tôi là: làm thế nào để bạn làm cho nó để user_id trong http://localhost:3000/articles/new/ là current_user.id tự động?

Ngoài ra, trong http://localhost:3000/articles/ người dùng chỉ có thể xem các bài viết được liên kết với user_id của họ, chứ không phải bất kỳ elses nào. Những gì thay đổi để điều khiển bài viết tôi nên thực hiện để làm điều này?

Đây là lần đầu tiên tôi đăng bài ở đây tại Stack Overflow và trợ giúp của bạn sẽ được đánh giá cao .. Cảm ơn bạn!

EDIT tìm thấy giải pháp cho câu hỏi đầu tiên, để tham khảo trong tương lai.

tôi đặt

<%= f.hidden_field :user_id %> 

trong _form.html.erb, và

def create 
    @article.user_id = current_user.id 
    ... 
end 

để điều khiển bài viết của tôi. Đây là thành công vượt qua current_user.id như user_id của bài viết một cách hoàn hảo.

+0

Vui lòng cụ thể hơn. Bạn có ý nghĩa rất ít. – clyfe

+0

Tôi nghĩ rằng tôi đã giải thích nó cũng như tôi có thể .. nhưng ok, TL; dr -> bảng bài viết có 3 trường (tiêu đề, bài viết và user_id). Tôi hỏi làm thế nào user_id trong form tạo có thể = current_user.id từ Devise. – cdotfeli

Trả lời

4

Bây giờ câu hỏi của tôi là: làm thế nào để bạn thực hiện nó để user_id rằng trong http://localhost:3000/articles/new/ là current_user.id tự động?

Bạn nên thêm vào articles_controller của "def mới" dòng này @ ask.user_id = current_user.id

như vậy thì form_for @ask hỏi cho user_id tài sản của @ask và hiển thị nó. Nhưng tôi không khuyên bạn nên làm điều này trong một ứng dụng thực thế giới, nơi bạn có lẽ sẽ xử lý bước này trong "def tạo" của `articles_controller

'Ngoài ra, trong http://localhost:3000/articles/ người sử dụng nên chỉ có thể xem các bài viết liên kết với user_id của họ, không phải bất cứ ai elses. Những gì thay đổi để điều khiển bài viết tôi nên thực hiện để làm điều này?

bên trong articles_controller 's def index, đổi thành @articles = Article.where(user_id:current_user.id). Lưu ý rằng bạn cũng nên thêm before_filter :require_user để đảm bảo rằng current_user không phải là số không.

+0

^^ Cảm ơn. Tôi nghĩ tôi đã tìm ra. Tôi đặt <% = f.hidden_field: user_id%> trong _form.html.erb và @ article.user_id = current_user.id trong 'def create' của article_controller, điều này đang chuyển current_user.id thành user_id của bài viết một cách hoàn hảo. Giải pháp thứ hai của bạn có ý nghĩa; Tôi sẽ đưa ra một phát bắn ngay bây giờ. – cdotfeli

+0

@cdotfeli Đặt user_id trong biểu mẫu và không kiểm tra sau đó có nghĩa là bạn có thể mạo danh bất kỳ người dùng nào của trang web của mình bằng cách thực hiện yêu cầu POST thủ công. –

+0

@ P.S.V.R. Giải pháp thứ hai của bạn đã hoạt động !! Cảm ơn một bó. Tôi sẽ thêm rằng before_filter: require_user bây giờ. – cdotfeli

4

Trong ArticleController # hành động mới của bạn thêm dòng sau:
@article = current_user.articles.build

Đối với action index của bạn:
@articles = current_user.articles

Các vấn đề liên quan