如果只在某些情况下执行,则使用 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
以下是我为 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