2011-01-10 4 views
2

Эй, надеюсь, вы можете мне помочь.как ограничить пользователей только редактировать свои записи

Я использую рельсы 3 с драгоценным камнем.
Я пытаюсь найти способ разрешить пользователям редактировать только созданные им сообщения/комментарии.
Должен ли я добавить камень CanCan для этого или я могу сделать это с помощью программы? Или возможен простой запрос Active Record?

Большое спасибо.

+0

IMO cancancan - это способ перехода с долгосрочной перспективы. у вас больше возможностей и контроля, но ценой небольшой кривой обучения. – BKSpurgeon

ответ

6

Devise создает хэш current_user, который вы можете использовать в своих контроллерах, моделях и представлениях. Так оно и должно быть легко создать чек, который делает что-то вроде этого:

@comment = Comment.find(params[:id]) 
if current_user.id == @comment.user.id 
    # yadda 
end 
+1

Или 'current_user.comments.include? (@ Comment)' – Garrett

+0

Я думаю, что использование этого метода позволит злоумышленнику редактировать сообщения/комментарии, принадлежащие другим, путем редактирования URL-адреса. (т. е. .../comments/1/edit) Не хватает ли я того, как это мешает пользователям делать изменения так, как я только что описал? – Nick

1

CanCan немного избыточен для ваших потребностей, но это будет более гибким для последующих эволюций.

В противном случае просто сравните user_id и author_id.

+0

Спасибо! Я буду помнить CanCan: D – daniel

10

Если у вас есть отношения между User и Post/Comment, вы можете использовать это отношение к только получать записи, принадлежащие пользователю в вашем edit действия:

class PostsController < ApplicationController 
    def edit 
    # Instead of this: 
    # Post.find(params[:id]) 
    # Use this: 
    current_user.posts.find(params[:id]) 
    end 
end 

Это будет найти только, если пост текущий пользователь создал его.

Естественно, вам также придется изменить действие update.

+0

отлично! Спасибо за ответ – daniel

+0

Бонус в том, что он будет автоматически показывать ответ 404, если сообщение не найдено. Хм .. но это не технически правильно. «Не разрешено» или подобное может быть лучше. – Heikki

+0

'current_user' является пользователем. – Heikki

Смежные вопросы