未显示已创建的博客条目

时间:2014-03-30 15:19:30

标签: ruby macos ruby-on-rails-4

我是Rails的新手并且正在学习使用此tutorial创建博客。在步骤10中,一旦我定义了创建和显示,在浏览器中创建新帖子后,我看不到任何带有id页面的条目。我看到的只是标题和空白标题和帖子标题。

以下是我的控制器 -

class PostController < ApplicationController

def index
end

def new
end

def create
    @post = Post.new(params[:posts])
    @post.save
    redirect_to @post
end

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

显示视图---

<h1>Show a post</h1>

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

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

路线---

RailsBlog::Application.routes.draw do

  resources :post
  root :to => "post#index"
end

表格---

<%= form_for :post, url: {action: 'create'} 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 'Submit' %>
</p>
<% end %>   

可能这只是一个拼写错误,但由于我最近开始学习Rails,我无法解决这个问题。

更新:我可以使用

转到特定ID
http://localhost:3000/post/1

但我只看到带有视图标题的空白页

2 个答案:

答案 0 :(得分:1)

问题在于:

@post = Post.new(params[:posts])

它应该是params[:post] - 单数,而不是复数。

另请注意,form_for的最佳做法是传递对象而不是符号:

form_for @post do |f|

然后:

  1. 您无需指定网址
  2. 您可以为编辑操作或创建操作重用相同的表单(如果由于验证失败而导致对象创建失败)
  3. 但是,这需要在new操作中初始化新对象:

    def new
      @post = Post.new
    end
    

    更新:

    您的路线也不正确。在定义多个资源时,您需要使用复数形式(它更多的是约定而非要求,但因为您正在学习坚持它)。因此,将您的路线更改为:

    resources :posts
    

    并将控制器重命名为PostsController(请记住重命名文件名)。重启服务器,一切都应该有效。

    另一个更新:

    您还需要将文件夹app/views/post重命名为app/view/posts

    又是另一个更新:

    在rails 4中,不允许使用强参数批量分配任何尚未列入白名单的参数。你需要告诉rails你允许首先分配哪些字段 - 这是一个安全问题。您需要对控制器进行一些更改:

    class PostsController < ApplicationController
      ...
    
      def create
        @post = Post.new(post_params)
        ...
      end
    
      ...
    
      private
    
      def post_params
        params.require(:post).permit(:title, :text)
      end
    end
    

    这是告诉您的控制器您希望表单中的这些属性可以安全分配的方法。

答案 1 :(得分:1)

我在同一个教程中遇到了类似的问题。 代码拼写是正确的,并且清楚地符合上面教程和BroiSatse的答案中的示例。

错误是私人方法定义的顺序 怎么样:

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

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

工作单:

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

private ...

无论如何,这个话题非常有用。谢谢你的答案!