2015-11-05 43 views
0

解释当我点击新的岗位,并试图挽救一个新的职位它给我的错误,然后我去控制器:获得“参数丢失或为空值:后”下面

private 
    def posts_params 
    params.require(:post).permit(:title, :description) 
    end 

并将'require(:post)'改为'require(:posts'),然后我工作 但我尝试编辑刚刚创建的新帖子,当我点击保存时,它给了我同样的错误,然后我只是改变它回到'必需(:后)“,它的工作原理,为什么发生这种情况?它就像一个循环,如果一个工程,另一个不工作,我必须改变这一件事

控制器:

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 %> 

可有人指出这个问题了呢?

回答

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| %> 

轨将找出哪些可自动呼叫你,所以你不会有指定的路径..

在一个侧面说明,我可能会改变@posts@post无处不在,但索引行动,只是为了使它更有意义,因为在新的,编辑等。你正在处理一个单一的职位。

由于rails在生成路由时正在查看变量的Model/class(当给定实例变量时),变量的名称对框架无关紧要,但使其更容易(在我看来)程序员了解

+0

谢谢,这解决了它,并感谢解释,所以我可以理解这是什么造成的,我该怎么办才能解决它,所以我可以在未来付出更多的关注,很好的答案 – GaoVN

相关问题