Rails指南第5.7节中的NoMethodError

时间:2013-07-04 07:34:55

标签: ruby-on-rails ruby

我正在按照Rails 4.0.0的入门教程进行操作: http://guides.rubyonrails.org/getting_started.html

我正处于5.7节中我应该得到ActiveModel :: ForbiddenAttributes错误的地方。相反,我得到了这个错误:

NoMethodError in Posts#show

Showing C:/Rails/blog/app/views/posts/show.html.erb where line #8 raised:

undefined method `text' for nil:NilClass
Extracted source (around line #8):
5
6  <p>
7    <strong>Text:</strong>
8    <%= @post.text %>
9 </p>

尽管如此,我相信这些帖子正在创建,因为每次提交表单时ID都会增加。我是Rails的新手,并试图完全按照说明进行操作。

我正在使用Ruby 1.9.3和Rails 4.0.0运行Windows 7 x64。

以下是一些相关文件;如果有其他要求,请告诉我。

posts_controller.rb:

class PostsController < ApplicationController
def new
end

def create
   @post = Post.new(post_params)

  @post.save
  redirect_to @post
end

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

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

end

show.html.erb:

<p>
  <strong>Title:</strong>
  <%= @post.title %>
</p>

<p>
  <strong>Text:</strong>
  <%= @post.text %>
</p>

new.html.erb

<h1>New Post</h1>

<%= form_for :post, url: posts_path do |f| %>
  <p>
    <%= f.label :title %><br>
    <%= f.text_field :title %>
  </p>

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

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

2 个答案:

答案 0 :(得分:2)

只需在show方法后写下create方法,因为您的show方法位于关键字private之下,它将私有作为Access Modifier,因此无法访问直接通过浏览器

class PostsController < ApplicationController
  def new
  end

  def create
    @post = Post.new(post_params)    
    @post.save
    redirect_to @post
  end

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

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

答案 1 :(得分:1)

我在教程中遇到了同样的问题(在此日期(2014年11月18日)使用'文章'而不是'帖子'),并发现解决方案是放置以下“def”块在articles_controller.rb中:

  def show
    @article = Article.find(params[:id])
    end

这就是我的样子:

class ArticlesController < ApplicationController
def new
    end

def create
    @article = Article.new(article_params)

    @article.save
    redirect_to @article
end

def show
    @article = Article.find(params[:id])
end

private
def article_params
    params.require(:article).permit(:title, :text)
end 
end