我对Rails很陌生,我正在玩它。现在,我尝试了解Rails 4中引入的strong parameter
功能。以下是我的代码:
class PostsController < ApplicationController
def index
end
def show
end
def create
p = Post.new(create_post_params)
p.save
redirect_to p
end
def new
end
private
def create_post_params
params.require(:post).permit :title, :body
end
end
除了控制器,我还有一个带有title
和body
的帖子模型。我的问题是params.require(:post).permit :title, :body
中的:post 是什么?我把它写成:post ,是因为我目前在PostsController
内吗?或者我正在阅读Post
的属性?
根据gdpelican的回答,如果我的new.html.erb
是这样的话:
<h1>Create a post</h1>
<%= form_for :post, url: posts_path do |f| %>
<div class="form-group">
<%= f.label :title %>
<%= f.text_field :title, class: "form-control" %>
<p class="help-block">Please type the title of the post</>
</div>
<div class="form-group">
<%= f.label :body %>
<%= f.text_area :body, class: "form-control", rows: 5 %>
<p class="help-block">Please type the body of the post</>
</div>
<%= f.submit class: "btn btn-primary" %>
<% end %>
<%= form_for :post, url: posts_path do |f| %>
中的:帖子部分确定我应该在params.require(:post).permit :title, :body
中使用:发布,对吗?
答案 0 :(得分:2)
它是表单值的JSON包装器的名称。
表单通常会包装表单参数,如下所示:
{
post: {
title: "Title",
body: "Body",
}
}
使用form_for @post
实质上,params.require(:post).permit(:title, :body)
说两件事:
form_for
中的参数会影响参数的包装。
通常,控制器的名称与表单参数的名称相匹配,因此在大多数情况下,它是一个安全的假设,即#Books.ThetrollerController&#39;将接受表格中的表格参数&#39;字段。
答案 1 :(得分:2)
您的参数(通常)如下所示
{"utf8"=>"✓", "authenticity_token"=>"...", "post"=>{"title"=>"My title", "body" =>"Body of my Post"}}
当您需要参数中的特定键(例如post)时,如果传递的哈希没有"post"=>{....}
,Rails将抛出错误,然后一旦通过该检查,它就允许允许键和返回仅嵌套在&#34; post&#34;下的参数哈希允许。要复制api文档示例
params = ActionController::Parameters.new({
person: {
name: 'Francesco',
age: 22,
role: 'admin'
}
})
params.require(:person).permit(:name, :age)
=>{"name"=>"Francesco", "age"=>22}
因此,在强大的params检查之后,返回的是您允许的:post
参数哈希值。
编辑:回答你的第二个问题。
这是思考它的一种方式。您的表单语法(form_for :post
)正在创建post
哈希,其中包含嵌套在其中的属性,并将其作为整体参数哈希的一部分发送。并且你的params.require(:post)
占用整个参数,并且只找到它想要的散列键(post
),然后允许后散列内的键。