我正在Rails中创建一个控制器,我正在寻找方法为不同的控制器方法使用不同的强参数
在更新和新操作中,我想要求post
params.require(:post).permit(:body, :is_public, :title, :id)
但是在post/index
中,我不需要这些参数。
如何为不同的控制器方法设置不同的要求强参数?
答案 0 :(得分:6)
您的“强参数方法”只是Ruby方法。您可以有任意多个。
class PostsController < ApplicationController
def create
@post = Post.new(post_params)
end
def update
@post = Post.find(params[:id])
if @post.update(update_params)
# ...
else
# ...
end
end
private
def base_params
params.require(:post)
end
# Don't take IDs from the user for assignment!
def update_params
base_params.permit(:body, :title)
end
def create_params
base_params.permit(:body, :title, :foo, :bar)
end
end
您也可以根据需要命名。称其为[resource_name]_params
只是一种脚手架惯例。
但是强大的参数只是将参数列入白名单以避免大量分配漏洞的一种机制。它们并没有神奇地清除参数(仅允许使用某些标量类型)。
在99.9%的情况下,您将只处理更新中具有强参数的参数,并创建与POST和PUT / PATCH对应的操作。这些是从用户获取参数哈希并将其传递给模型的操作。如果您不小心将许可参数列入白名单,则可能会存在潜在的批量分配漏洞。
show
,edit
和destroy
操作通常仅采用ID形式的单个参数。 new
很少使用任何参数,而index
仅在构建某种搜索或过滤条件时才使用参数。
show
,edit
,new
和index
是GET路由,因此它们应是幂等的,不得更改或创建资源。
除非您真的完全弄乱了所有内容,否则这些都没有任何真正的潜在潜在大规模分配漏洞。
答案 1 :(得分:2)
只需做
class FooController < ApplicationController
def create
@post = Post.new(create_params)
if @post.save
blah
else
blah
end
end
def index
... something else
end
private
def create_params
params.require(:post).permit(:body, :is_public, :title, :id)
end
end