当我点击新帖并尝试保存新帖子时,它会给我错误,然后我转到控制器:
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 %>
有人可以指出问题吗?
答案 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 /类(当给定实例变量时)变量的名称对框架并不重要(但在我看来)让程序员理解