Как ограничить редактирование конкретными пользователями, которые создали пост в ruby ​​on rails? - PullRequest
2 голосов
/ 18 мая 2011

Я создал функцию отправки сообщений, используя ruby, проблема, с которой я столкнулся, заключается в том, что функция редактирования сообщения доступна, но она доступна любому пользователю независимо от того, кто опубликовал исходное сообщение. Как я могу сделать так, чтобы редактируемая «ссылка» была только видимой, доступной или использованной оригинальным постером. Если какой-либо код требуется, пожалуйста, спросите, спасибо.

Это ошибка, которую я получаю сейчас:

undefined local variable or method `current_user' for #<ActionView::Base:0x4cdbb48>
Extracted source (around line #7):

4:     <dd>
5:     <%= car.name %><br />
6:     <%= car.description %><br />
7:     <%= link_to('edit', edit_post_path(@car)) if current_user.cars.include?(@car) %>
8:     <%= link_to "Delete", 
9:     :controller => :car, 
10:    :action => :delete,

Ответы [ 2 ]

2 голосов
/ 18 мая 2011

Если у вас есть способ получить доступ к объекту пользователя, вы должны иметь отношения к своим сообщениям, например:

class User < ActiveRecord::Base
  has_many :posts
end

class Post < ActiveRecord::Base
  belongs_to :user
end

Это позволяет вам получать и создавать сообщения для пользователей следующим образом:

User.find(1).posts #=> [<Post id:1>, <Post id:2>, <Post id:4>]

Enumerable # detec может зацикливаться на массиве и возвращать первый элемент, который оценивается как true в блоке, примерно так:

@post = User.find(1).posts.detect do |post|
  post.id == 4
end
@post #=> <Post id:4>

Большинство приложений Rails имеют своего рода помощника для доступа к вошедшему в данный момент пользователю. Если нет, то я предлагаю вам поместить его в application_controller следующим образом:

def current_user
  @current_user ||= User.find(whatever_you_do_to_get_the_logged_in_user)
end

Скопируйте поиск в действия по редактированию и обновлению постов, которыми владеет пользователь, например:

def edit
  @post = current_user.posts.detect{|p| p.id == params[:id] }
end

и по вашему мнению:

<%= link_to('edit', edit_post_path(@post)) if current_user.posts.include?(@post) %>
2 голосов
/ 18 мая 2011

Вам необходимо связать сообщение с создателем пользователя в вашей модели и проверить право собственности и / или разрешение в действии редактирования.

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

Railscast использует cancan с authlogic, но он может работать сдругая аутентификация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...