我是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,我无法解决这个问题。
更新:我可以使用
转到特定IDhttp://localhost:3000/post/1
但我只看到带有视图标题的空白页
答案 0 :(得分:1)
问题在于:
@post = Post.new(params[:posts])
它应该是params[:post]
- 单数,而不是复数。
另请注意,form_for的最佳做法是传递对象而不是符号:
form_for @post do |f|
然后:
但是,这需要在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 ...
无论如何,这个话题非常有用。谢谢你的答案!