【问题标题】:Only allow a user to edit their own content只允许用户编辑自己的内容
【发布时间】:2015-02-09 20:19:49
【问题描述】:

我正在使用 RoR 4 和 Devise gem 进行用户身份验证。我希望用户能够编辑他们自己的内容,而不是其他任何人的内容。 authenticate_user 方法似乎只是确保用户在编辑内容之前已登录。但是另一个用户可以注册并编辑其他人的内容。

我的控制器看起来像:

    class PrayersController < ApplicationController
  before_action :find_prayer, only: [:show, :edit, :updated, :destroy]
  before_action :authenticate_user!, except: [:index, :show]

  def index
    @prayers = Prayer.all.order("created_at DESC")
  end

  def show
  end

  def new
    @prayer = current_user.prayers.build
  end

  def edit
  end

  def create
    @prayer = current_user.prayers.build(prayer_params)

      if @prayer.save
        redirect_to @prayer, notice: "Successfully created prayer"
      else
        render 'new'
      end
  end

  def update
        @prayer = Prayer.find_by_id(params[:id])

        if @prayer.update(prayer_params)
          redirect_to @prayer, notice: "Prayer was successfully updated"
        else
          render 'edit'
        end        
  end

  def destroy
    @prayer.destroy
    redirect_to root_path
  end

  private
    def prayer_params
      params.require(:prayer).permit(:title, :body)
    end

    def find_prayer
      @prayer = Prayer.find(params[:id])
    end
end

我尝试创建一个自己的 before_action,看起来像这样:

    def own_prayer
  if !current_user == Prayer.current_user
    redirect_to @prayer, notice: "You cannot edit this prayer"
  end  
end

但这没有用。我可以通过类似的操作限制通过视图访问表单,但我认为这不完全安全?

谢谢

【问题讨论】:

    标签: ruby-on-rails-4 devise


    【解决方案1】:

    我猜你在Prayer 类上没有类方法current_user。似乎您的用户模型中有has_many :prayers。因此,要获得祈祷的用户,您需要在 Prayer 实例变量上调用 user 方法。

    应该是这样的:

    @prayer = Prayer.find params[:id]
    
    unless current_user == @prayer.user
       redirect_to(@prayer, notice: "You cannot edit this prayer") and return
    end
    

    如果您需要更棘手的限制规则,请使用cancan gem

    【讨论】:

    • 非常感谢。这会在我的祈祷控制器的更新方法中使用吗?
    • 我猜你也需要限制编辑方法,所以你可以在上面的代码中添加before_filter own_prayer, only: [:edit, :update]方法。然后从更新方法中删除@prayer = Prayer.find_by_id(params[:id])
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多