【问题标题】:undefined local variable or method `post'未定义的局部变量或方法“post”
【发布时间】:2015-12-26 07:52:34
【问题描述】:

这是我的 cmets _form.html.erb 表格:

<%= form_for([post, @comment]) do |f| %>
    <p>
        <%= f.text_area :body, placeholder: "Write a comment!" %>
    </p>
    <br>
    <p> <%= f.submit %> </p>

<% end %>

这是我的帖子表单_form.html.erb:

<%= form_for @post, url: post_path(@post), method: :patch do |f| %>
        <% if @post.errors.any? %>
          <div id="errors">
            <h2><%= pluralize(@post.errors.count, "Error") %> Prevent this post from posting</h2>
            <ul>
                <% @post.errors.full_messages.each do |msg| %>
                    <li><%= msg %></li>

                <% end %>
            </ul>
          </div>
        <% end %>
        <p>
             <%= f.label :Edit_Post %><br>
             <%= f.text_area :body %>
        </p>
        <p>
            <%= f.submit  %>
        </p>

<% end %>

这是我的 cmets_controller.rb:

class CommentsController < ApplicationController
    def create 
       @post = Post.find(params[:post_id])
       @comment = @post.comments.build(params[:comment])
       @comment.save
       redirect_to @posts
    end
    def destroy
        @user = User.find(session[:user_id])
        @posts = Post.find(params[:post_id])
        @comment = @post.comments.find(params[:id])
        @comment.destroy
        redirect_to post_path(@post)
    end
end

这是我的posts_controller.rb:

class PostsController < ApplicationController
    before_action :load_post, only: [:show, :edit, :update, :destroy]

    def index
        @user = User.find(session[:user_id])
        @posts = Post.all
    end
    def welcome
        @user = User.find(session[:user_id])
        @posts = Post.order("created_at desc").limit(4).offset(1)
        @signed_in_user = session[:user_id]
    end
    def posts
        @user = User.find(session[:user_id]) unless session[:user_id] == nil
        redirect_to login_path, notice: "You're not logged in" unless @user 
        @signed_in_user = session[:user_id]

    end
    def new 
        @post = Post.new
        @user = User.find(session[:user_id])
    end
    def create 
        @user = User.find(session[:user_id])        
        @post = Post.new(post_params)

        @post.user_id = @signed_in_user

        if  @post.save 
            redirect_to dashboard_path 
        else
            render 'new'
        end
    end
    def show
        @user = User.find(session[:user_id])

        @signed_in_user = session[:user_id]
    end
    def edit
        @user = User.find(session[:user_id])
    end 

    def update
        if @post.update(post_params)
            redirect_to @post, notice: "Your post has been updated!"
        end
    end
    def destroy
        @user = User.find(session[:user_id])
        @post.user_id = @signed_in_user

        @post.destroy

        redirect_to posts_path
    end

    private

    def load_post
        @post = Post.find(params[:id])
    end
    def post_params
        params.require(:post).permit(:body)
    end
end

有这个问题。任何帮助将不胜感激。这是我遇到的错误的图片:

编辑:这是我的日志

Started GET "/posts/24" for 127.0.0.1 at 2015-09-28 18:46:44 -0700
Processing by PostsController#show as HTML
  Parameters: {"id"=>"24"}
  [1m[36mPost Load (0.0ms)[0m  [1mSELECT  "posts".* FROM "posts" WHERE "posts"."id" = ? LIMIT 1[0m  [["id", 24]]
  [1m[35mUser Load (0.0ms)[0m  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 1]]
  [1m[36mCACHE (0.0ms)[0m  [1mSELECT  "posts".* FROM "posts" WHERE "posts"."id" = ? LIMIT 1[0m  [["id", "24"]]
  [1m[35m (0.0ms)[0m  SELECT COUNT(*) FROM "comments" WHERE "comments"."post_id" = ?  [["post_id", 24]]
  Rendered comments/_form.html.erb (1.0ms)
  Rendered posts/show.html.erb within layouts/application (7.0ms)
  Rendered layouts/_nav.html.erb (1.0ms)
Completed 200 OK in 451ms (Views: 412.0ms | ActiveRecord: 1.0ms)

【问题讨论】:

    标签: ruby-on-rails ruby posts


    【解决方案1】:
    undefined local variable or method `post'
    

    您的错误信息说明了一切。它告诉您,您没有在视图的相应控制器操作中定义post。这就是您收到该错误的原因。

    因此,您需要在相应的控制器操作中定义@post(通常在这种情况下使用实例变量),即PostsControllershow 操作。您实际上需要定义 @comment 并且您目前在控制器操作中没有它。因此,像这样更新您的 show 方法:

    def show
        @user = User.find(session[:user_id])
        @signed_in_user = session[:user_id]
    
        # you need to define @post and @comment
        @post = Post.find params[:id]
        @comment = Comment.new(post: @post)
    end
    

    然后,您可以在视图中使用@post@comment,因此您的comments/_form.html.erb 将如下所示:

    <%= form_for([@post, @comment]) do |f| %>
    . . . 
    . . . 
    

    【讨论】:

    • 好吧,我知道你在做什么,这是有道理的,只是在进行这些更改后我现在遇到了以下问题。找不到带有 'id'= 的帖子
    • 是的,您可能需要做一些调整来获得@post@comment,我们的想法是在控制器的操作方法中正确定义它们。 params 哈希是怎样的?你能做到:puts params.inspect 在你的show method 中吗?您可能必须这样做:@post = Post.find params[:id]
    • 好吧,在将@post 更改为您所说的内容之后,我应该得到这个有趣的以下错误。没有路由匹配 {:action=>"index", :controller=>"cmets", :post_id=>nil} 缺少必需的键:[:post_id] 模板包含的跟踪:app/views/users/dashboard.html.erb
    • 您将@post = Post.find params[:post_id] 更改为@post = Post.find params[:id] 之后出现此错误?这对我来说没有多大意义。好的,保留它:@post = Post.find params[:post_id] 但在 show 方法中执行 puts params.inspect 并让我看看输出。
    • 我放了 puts params.inspect 后什么都没有弹出。页面加载正常,没有别的。
    【解决方案2】:

    Rails 可以将实例变量从控制器传递到视图,您应该在 conmments/_form.html.erb 中使用 @post 替换 post

    <%= form_for([@post, @comment = @post.comments.build]) do |f| %>
    

    【讨论】:

    • 执行此操作后,我收到以下错误表单中的第一个参数不能包含 nil 或为空
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 2018-04-19
    • 2015-01-01
    • 2013-12-17
    相关资源
    最近更新 更多