如果只在某些情况下执行,则使用 rails before_action

Using rails before_action if it is only executed in certain cases

以下是我为 Rails 节目审查应用程序编写的其中一个控制器的代码。请注意,我没有使用 Devise 进行用户身份验证。 我现在面临的问题是,如果 he/she 是最初上传节目的人,我希望用户 (pco) 只能更新节目。这里,authorized_as_pco_to_show 可以确定,但它需要将 @show 作为参数传递给它。因此,我不能使用 before_action.

我现在的方法是将此 authorized_as_pco_to_show 方法放在每个操作的开头,只允许正确的 pco 访问它。我想知道是否有更好的方法来做到这一点。任何帮助将不胜感激!

  def update
    authorized_as_pco_to_show @show
    
    respond_to do |format|
      if @show.update(show_params)
        format.html { redirect_to @show, notice: "Show was successfully updated." }
        format.json { render :show, status: :ok, location: @show }
      else
        format.html { render :edit, status: :unprocessable_entity }
        format.json { render json: @show.errors, status: :unprocessable_entity }
      end
    end
  end

如果需要,您可以将参数传递给 before 操作。而不是这个:

before_action :authorized_as_pco_to_show

您可以使用:

before_action do
  authorized_as_pco_to_show @show
end

但是,如评论中所述,您需要从某个地方获取该节目。假设你有另一个 before_action 沿着 load_show 的路线将它加载到一个实例变量中,然后你可以在你的另一个 before_action 中使用它。像这样:

before_action :load_show, :authorized_as_pco_to_show

# your actions here

private

def load_show
  @show = Show.find(params[:id])
end

def authorized_as_pco_to_show
  @show.authorized? # replace with whatever your checks are
end