获取" param缺失或值为空:post"解释如下

时间:2015-11-05 15:43:03

标签: ruby-on-rails ruby

当我点击新帖并尝试保存新帖子时,它会给我错误,然后我转到控制器:

private
  def posts_params
    params.require(:post).permit(:title, :description)
  end

并更改'要求(:发布)'要求(:帖子'然后我工作 但后来我尝试编辑我刚刚创建的新帖子,当我点击保存它时,它给了我同样的错误,然后我只需将其改回“' required(:post)'它有效,为什么会发生这种情况?它就像一个循环,如果一个人工作,另一个人没有工作,我必须改变那一件事

控制器:

class PostsController < ApplicationController
  def index
    @posts = Post.all
  end

  def edit
    @posts = Post.find(params[:id])
  end

  def update
  @posts = Post.find(params[:id])

  if @posts.update(posts_params)
    redirect_to @posts
  else
    render 'edit'
  end
end

  def new
    @posts = Post.new
  end

  def create
      @posts = Post.new(posts_params)
    if @posts.save
        redirect_to @posts
    else
        render 'new'
    end
  end

  def show
    @posts = Post.find(params[:id])
  end

  private
  def posts_params
    params.require(:post).permit(:title, :description)
  end


end

查看编辑:

<h1>Editing post</h1>

<%= form_for(@posts)  do |f| %>

  <% if @posts.errors.any? %>
    <div id="error_explanation">
      <h2>
        <%= pluralize(@posts.errors.count, "error") %> prohibited
        this post from being saved:
      </h2>
      <ul>
        <% @posts.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <p>
    <%= f.label :title %><br>
    <%= f.text_field :title %>
  </p>

  <p>
    <%= f.label :description %><br>
    <%= f.text_area :description %>
  </p>

  <p>
    <%= f.submit %>
  </p>

<% end %>

<%= link_to 'Back', posts_path %>

查看新内容:

<h1>New Article</h1>
<%= form_for :posts, url: posts_path do |f| %>
<% if @posts.errors.any? %>
    <div id="error_explanation">
      <h2>
        <%= pluralize(@posts.errors.count, "error") %> prohibited
        this post from being saved:
      </h2>
      <ul>
        <% @posts.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
  <% end %>
  <p>
    <%= f.label :title %><br>
    <%= f.text_field :title %>
  </p>

  <p>
    <%= f.label :description %><br>
    <%= f.text_area :description %>
  </p>

  <p>
    <%= f.submit %>
  </p>
<% end %>
<%= link_to 'Back', posts_path %>

有人可以指出问题吗?

1 个答案:

答案 0 :(得分:1)

你正在混合

form_for(@posts)  do |f| 

 form_for :posts, url: posts_path 

在表格中。

:posts版本将生成params[:posts],@posts版本将生成params[:post]。因此,你看到的问题。确保posts_params如下。

def posts_params
  params.require(:post).permit(:title, :description)
end

然后只需将两个表单更改为

<%= form_for(@posts) do |f| %>

rails会找出自动为您调用的内容,因此您无需指定路径..

在旁注中,我可能会将@posts更改为@post,但是索引操作,只是为了让它更有意义,因为在新的,编辑等等。你正在处理用一个单一的帖子。

由于rails在生成路径时正在查看变量的Model /类(当给定实例变量时)变量的名称对框架并不重要(但在我看来)让程序员理解