PostsController中的NoMethodError #create undefined method`body'

时间:2016-08-12 17:34:07

标签: ruby-on-rails rails-routing

每当我尝试保存帖子时,都会显示此错误。

Image

这是我的new.html.erb文件。

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

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

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

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

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

这是我的show.html.erb文件。

<div id="page_wrapper">
<h1 class="title">
    <%= @post.title %>
</h1>

<p class="date">
    Submitted <%= time_ago_in_words(@post.created_at) %> Ago
</p>

<p class="time">
    <%= @post.time %>
</p>

<p class="location">
    <%= @post.location %>
</p>
</div>

这是我的posts_controller.rb文件。

class PostsController < ApplicationController
 def index
    @posts = Post.all.order('created_at DESC')      
 end

 def new    
    @post = Post.new    
 end

 def create
    @post = Post.new(post_params)

    if @post.save   
        redirect_to @post
    else
        render 'new'
    end
 end

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

 private
 def post_params
    params.require(:post).permit(:title, :body, :location)
 end
end

她的routes.rb档案

 Rails.application.routes.draw do
  resources :posts
  root "posts#index"
 end

2 个答案:

答案 0 :(得分:2)

您已在body中添加了post.rb的验证。但是,您的body表中没有字段posts

因此,当调用@post.create时,post.rb中定义的所有验证都会运行,因为您没有body字段,所以您获得了{{1}错误。

要解决此问题,请移除Undefined method 'body' for Post

body的验证

删除以下行

post.rb

你应该好好去。

答案 1 :(得分:0)

params.require(:post).permit(:title, :body, :location)

您需要:body,但在表单中您有title, date, time and location

删除它,并确保你的强属参数中有这个属性:

params.require(:post).permit(:title, :date, :time, :location)