2016-08-10 10 views
-1

Я начиная с рубином на рельсах, и я хочу знать, как запретить пользователь редактировать запись, которая не, это мой код:разрешения падла рубин на рельсах

class PinsController < ApplicationController 
    before_action :find_pin, only: [:show, :edit, :update, :destroy, :upvote] 
    before_action :authenticate_user!, except: [:index , :show] 
    def index 
     @pins = Pin.all.order("created_at DESC") 
    end 

    def show 
    end 

    def new 
     @pin = current_user.pins.build 
    end 

    def create 
     @pin = current_user.pins.build(pin_params) 

     if @pin.save 
      redirect_to @pin, notice: "Pin creado" 
     else 
      render 'new' 
     end 
    end 

    def edit 
    end 

    def update 
     if @pin.update(pin_params) 
      redirect_to @pin, notice: "Actualizado correctamente" 
     else 
      render 'edit' 
     end 
    end 

    def destroy 
     @pin.destroy 
     redirect_to root_path 
    end 

    def upvote 
     @pin.upvote_by current_user 
     redirect_to :back 
    end 

    private 

    def pin_params 
     params.require(:pin).permit(:title, :description, :image) 
    end 

    def find_pin 
     @pin = Pin.find(params[:id]) 
    end 
end 

, а также в представлении у меня есть две кнопки, одна для редактирования и удаления другой, так как я могу сделать это, только если вы aparescan является создателем записи?

+0

Пожалуйста вычитать ваш вопрос. Кажется, что вам не хватает того, что кажется очень важным словом: «запретите пользователю редактировать запись, которая не является», – MarsAtomic

+0

Сделайте это так же, как вы делаете это в своих «новых» и «созданных» действиях, current_user.pins ', который предоставит вам только те контакты, которые принадлежат зарегистрированному пользователю. – fanta

ответ

2
before_action :set_user_pins, only: [:edit, :update, :destroy, :show] 

def set_user_pins 
    @pin = current_user.pins.find_by(id: params[:id]) 
    redirect_request if @pin.blank? 
end 
0

В вашем действии обновления, вместо этого: if @pin.update(pin_params)

сделать что-то вроде этого:

pin = current_user&.pins.find_by(id: params[:id]) 
if pin 
    # do the update here because the pin belongs to current_user 
else 
    # raise a 403 'permission denied' error or something 
end 

в случае, если вы не знакомы с безопасным оператором навигации, user&.pins такая же, как if !user.nil? then user.pins else nil end.

Так что для рубина versios, прежде чем 2.3 вы можете сделать pin = current_user.pins.find_by(id: params[:id]) if current_user

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