before_filter с исключением для текущего пользователя

У меня есть этот ток перед фильтром в моем user_controller

before_filter :authenticate_usergroup, :except => [:edit, :update, :show]

Он отлично работает, просто позволяя пользователю редактировать свою информацию, но не имея возможности видеть всех пользователей, но я обнаружил, что, просто изменив свой «id» в URL-адресе, они также могут редактировать информацию других пользователей.

Как я могу разрешить функции :edit, :show и :update только текущему пользователю для их собственной записи. у меня есть этот метод в моем application_controller, чтобы иметь доступ к текущему пользователю

def current_user
 return unless session[:user_id]
 @current_user ||= User.find_by_id(session[:user_id])
end

#update from users_controller.rb
def update
@user = User.find(params[:id])

respond_to do |format|
  if @user.update_attributes(params[:user])
    format.html { redirect_to @user, :notice => 'User was successfully updated.' }
    format.json { head :no_content }
  else
    format.html { render :action => "edit" }
    format.json { render :json => @user.errors, :status => :unprocessable_entity }
  end
end
end

person Messyeater    schedule 09.12.2012    source источник
comment
Покажите нам одно из ваших действий, чтобы мы могли дать вам ответ с лучшим контекстом.   -  person deefour    schedule 09.12.2012
comment
@Deefour, я добавлю свое действие по обновлению (я думаю, это то, о чем вы спрашиваете), я извиняюсь, я новичок в ruby ​​on rails   -  person Messyeater    schedule 09.12.2012


Ответы (2)


если вы «указываете», что только current_user могут получить доступ к своей информации, то это не имеет значения.

так в шоу и редактировать

@user = current_user

в действии обновления что-то вроде current_user.update_attributes(params[:user]) должно помочь.

person pjammer    schedule 09.12.2012
comment
у меня есть это, так что админы могут обновлять любую информацию. это все еще позволит это? - person Messyeater; 09.12.2012
comment
спасибо, я воспользовался вашей идеей и поместил ее в оператор if, который проверял группу участника, вошедшего в систему, и использовал другой @user, если группа была администратором. - person Messyeater; 09.12.2012

Я сделал это следующим образом:

в #show action в контроллере:

if current_user.id == Certificate.find(params[:id]).user_id
  @certificate = Certificate.find(params[:id])
else
  redirect_to certificates_url, notice: 'You can only view your own certificates'
end

Я знаю, что он не использует «before_filter», но, похоже, он имеет тот же эффект, что и пользователи не могут просто вводить разные URL-адреса для просмотра информации о других пользователях.

person andrewcockerham    schedule 02.09.2013