了解Rails 4的强大参数

时间:2014-09-25 23:14:10

标签: ruby-on-rails ruby-on-rails-4 strong-parameters

我对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

除了控制器,我还有一个带有titlebody的帖子模型。我的问题是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中使用:发布,对吗?

2 个答案:

答案 0 :(得分:2)

它是表单值的JSON包装器的名称。

表单通常会包装表单参数,如下所示:

{
  post: {
    title: "Title",
    body:  "Body",
  }
}

使用form_for @post

之类的内容时

实质上,params.require(:post).permit(:title, :body)说两件事:

  1. 我的参数必须有:post属性
  2. :post属性可能只有标题和正文参数,没有别的。
  3. 更新

    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),然后允许后散列内的键。