Ruby on rails RubyonRails:未定义的方法;评论“;零级:零级

Ruby on rails RubyonRails:未定义的方法;评论“;零级:零级,ruby-on-rails,Ruby On Rails,我正在为用户开发一个应用程序,每个用户的页面上都显示了一组MicroPost。我试图给这些微博客添加评论。每次访问localhost:3000/用户/(用户id) 我得到这个错误:nil:NilClass的未定义方法“comments” 只有当用户要显示MicroPost时,才会出现此错误。否则它只会显示他们的空白页。错误来自app/views/users/show.html.erb的此视图。此视图呈现此部分,错误发生在第13行 <li> <span class="cont

我正在为用户开发一个应用程序,每个用户的页面上都显示了一组MicroPost。我试图给这些微博客添加评论。每次访问localhost:3000/用户/(用户id)

我得到这个错误:nil:NilClass的未定义方法“comments”

只有当用户要显示MicroPost时,才会出现此错误。否则它只会显示他们的空白页。错误来自app/views/users/show.html.erb的此视图。此视图呈现此部分,错误发生在第13行

<li>
  <span class="content"><%= micropost.content %></span>
  <span class="timestamp">
    Posted <%= time_ago_in_words(micropost.created_at) %> ago.
  </span>
  <% if current_user?(micropost.user) %>
    <%= link_to "delete", micropost, method:  :delete,
                                     confirm: "You sure?",
                                     title:   micropost.content %>
  <% end %>

  <h2>Comments</h2>
  <% micropost.comments.each do |comment| %>
    <p>
      <b>Commenter:</b>
      <%= comment.commenter %>
    </p>

    <p>
      <b>Comment:</b>
      <%= comment.body %>
    </p>
  <% end %>

  <h3>Add a comment:</h3>
  <%= form_for([micropost, micropost.comments.build]) do |f| %>
    <div class="field">
      <%= f.label :commenter %><br />
      <%= f.text_field :commenter %>
    </div>
    <div class="field">
      <%= f.label :body %><br />
      <%= f.text_area :body %>
    </div>
    <div class="actions">
      <%= f.submit %>
    </div>
  <% end %>
</li>
  • 五年前发的。 评论 评论人:

    评论:

    添加评论:

  • 这是我的comment.rb文件

    class Comment < ActiveRecord::Base
      belongs_to :micropost
      attr_accessible :body, :user_id
    
    end
    
    class注释
    还有我的microscopt.rb文件

    class Micropost < ActiveRecord::Base
      attr_accessible :content
      belongs_to :user
      has_many :comments
    
      validates :content, presence: true, length: { maximum: 140 }
      validates :user_id, presence: true
    end
    
    class Micropost
    还有我的评论

    class CommentsController < ApplicationController
      def create
        @micropost = Micropost.find(params[:micropost_id])
        @comment = @micropost.comments.create(params[:comment])
        redirect_to micropost_path(@micropost)
      end
    
    end
    
    class MicropostsController < ApplicationController
      before_filter :signed_in_user
      before_filter :correct_user,   only: :destroy
    
      def create
        @micropost = current_user.microposts.build(params[:micropost])
        if @micropost.save
          flash[:success] = "Micropost created!"
          redirect_to root_path
        else
          @feed_items = []
          render 'static_pages/home'
        end
      end
    
    
      def new
        @micropost = Micropost.new(params[:micropost])
      end
    
      def show
    
        @micropost = Micropost.find(params[:id])
    
    
      end
    
      def destroy
        @micropost.destroy
        redirect_back_or root_path
      end
    
      private
    
        def correct_user
          @micropost = current_user.microposts.find_by_id(params[:id])
          redirect_to root_path if @micropost.nil?
        end
    end
    
    
        class CommentsController < ApplicationController
          def create
            @micropost = Micropost.find(params[:micropost_id])
            @comment = @micropost.comments.create(params[:comment])
            redirect_to micropost_path(@micropost)
          end
    
        end
    
    class UsersController < ApplicationController
      before_filter :signed_in_user, 
                    only: [:index, :edit, :update, :destroy, :following, :followers]
      before_filter :correct_user,   only: [:edit, :update]
      before_filter :admin_user,     only: :destroy
    
      def index
        @users = User.paginate(page: params[:page])
      end
    
      def show
        @user = User.find(params[:id])
        @micropost = @user.microposts.first
        @comment = Comment.new
      end
    
      def new
        @user = User.new
      end
    
      def create
        @user = User.new(params[:user])
        if @user.save
          sign_in @user
          flash[:success] = "Welcome to the Sample App!"
          redirect_to @user
        else
          render 'new'
        end
      end
    
      def edit
      end
    
      def update
        if @user.update_attributes(params[:user])
          flash[:success] = "Profile updated"
          sign_in @user
          redirect_to @user
        else
          render 'edit'
        end
      end
    
      def destroy
        User.find(params[:id]).destroy
        flash[:success] = "User destroyed."
        redirect_to users_path
      end
    
      def following
        @title = "Following"
        @user = User.find(params[:id])
        @users = @user.followed_users.paginate(page: params[:page])
        render 'show_follow'
      end
    
      def followers
        @title = "Followers"
        @user = User.find(params[:id])
        @users = @user.followers.paginate(page: params[:page])
        render 'show_follow'
      end
    
      private
    
        def correct_user
          @user = User.find(params[:id])
          redirect_to(root_path) unless current_user?(@user)
        end
    
        def admin_user
          redirect_to(root_path) unless current_user.admin?
        end
    end
    
    class CommentsController
    最后是我的microposts_controller.rb

    class CommentsController < ApplicationController
      def create
        @micropost = Micropost.find(params[:micropost_id])
        @comment = @micropost.comments.create(params[:comment])
        redirect_to micropost_path(@micropost)
      end
    
    end
    
    class MicropostsController < ApplicationController
      before_filter :signed_in_user
      before_filter :correct_user,   only: :destroy
    
      def create
        @micropost = current_user.microposts.build(params[:micropost])
        if @micropost.save
          flash[:success] = "Micropost created!"
          redirect_to root_path
        else
          @feed_items = []
          render 'static_pages/home'
        end
      end
    
    
      def new
        @micropost = Micropost.new(params[:micropost])
      end
    
      def show
    
        @micropost = Micropost.find(params[:id])
    
    
      end
    
      def destroy
        @micropost.destroy
        redirect_back_or root_path
      end
    
      private
    
        def correct_user
          @micropost = current_user.microposts.find_by_id(params[:id])
          redirect_to root_path if @micropost.nil?
        end
    end
    
    
        class CommentsController < ApplicationController
          def create
            @micropost = Micropost.find(params[:micropost_id])
            @comment = @micropost.comments.create(params[:comment])
            redirect_to micropost_path(@micropost)
          end
    
        end
    
    class UsersController < ApplicationController
      before_filter :signed_in_user, 
                    only: [:index, :edit, :update, :destroy, :following, :followers]
      before_filter :correct_user,   only: [:edit, :update]
      before_filter :admin_user,     only: :destroy
    
      def index
        @users = User.paginate(page: params[:page])
      end
    
      def show
        @user = User.find(params[:id])
        @micropost = @user.microposts.first
        @comment = Comment.new
      end
    
      def new
        @user = User.new
      end
    
      def create
        @user = User.new(params[:user])
        if @user.save
          sign_in @user
          flash[:success] = "Welcome to the Sample App!"
          redirect_to @user
        else
          render 'new'
        end
      end
    
      def edit
      end
    
      def update
        if @user.update_attributes(params[:user])
          flash[:success] = "Profile updated"
          sign_in @user
          redirect_to @user
        else
          render 'edit'
        end
      end
    
      def destroy
        User.find(params[:id]).destroy
        flash[:success] = "User destroyed."
        redirect_to users_path
      end
    
      def following
        @title = "Following"
        @user = User.find(params[:id])
        @users = @user.followed_users.paginate(page: params[:page])
        render 'show_follow'
      end
    
      def followers
        @title = "Followers"
        @user = User.find(params[:id])
        @users = @user.followers.paginate(page: params[:page])
        render 'show_follow'
      end
    
      private
    
        def correct_user
          @user = User.find(params[:id])
          redirect_to(root_path) unless current_user?(@user)
        end
    
        def admin_user
          redirect_to(root_path) unless current_user.admin?
        end
    end
    
    class MicropostsController
    这里还有users_controller.rb

    class CommentsController < ApplicationController
      def create
        @micropost = Micropost.find(params[:micropost_id])
        @comment = @micropost.comments.create(params[:comment])
        redirect_to micropost_path(@micropost)
      end
    
    end
    
    class MicropostsController < ApplicationController
      before_filter :signed_in_user
      before_filter :correct_user,   only: :destroy
    
      def create
        @micropost = current_user.microposts.build(params[:micropost])
        if @micropost.save
          flash[:success] = "Micropost created!"
          redirect_to root_path
        else
          @feed_items = []
          render 'static_pages/home'
        end
      end
    
    
      def new
        @micropost = Micropost.new(params[:micropost])
      end
    
      def show
    
        @micropost = Micropost.find(params[:id])
    
    
      end
    
      def destroy
        @micropost.destroy
        redirect_back_or root_path
      end
    
      private
    
        def correct_user
          @micropost = current_user.microposts.find_by_id(params[:id])
          redirect_to root_path if @micropost.nil?
        end
    end
    
    
        class CommentsController < ApplicationController
          def create
            @micropost = Micropost.find(params[:micropost_id])
            @comment = @micropost.comments.create(params[:comment])
            redirect_to micropost_path(@micropost)
          end
    
        end
    
    class UsersController < ApplicationController
      before_filter :signed_in_user, 
                    only: [:index, :edit, :update, :destroy, :following, :followers]
      before_filter :correct_user,   only: [:edit, :update]
      before_filter :admin_user,     only: :destroy
    
      def index
        @users = User.paginate(page: params[:page])
      end
    
      def show
        @user = User.find(params[:id])
        @micropost = @user.microposts.first
        @comment = Comment.new
      end
    
      def new
        @user = User.new
      end
    
      def create
        @user = User.new(params[:user])
        if @user.save
          sign_in @user
          flash[:success] = "Welcome to the Sample App!"
          redirect_to @user
        else
          render 'new'
        end
      end
    
      def edit
      end
    
      def update
        if @user.update_attributes(params[:user])
          flash[:success] = "Profile updated"
          sign_in @user
          redirect_to @user
        else
          render 'edit'
        end
      end
    
      def destroy
        User.find(params[:id]).destroy
        flash[:success] = "User destroyed."
        redirect_to users_path
      end
    
      def following
        @title = "Following"
        @user = User.find(params[:id])
        @users = @user.followed_users.paginate(page: params[:page])
        render 'show_follow'
      end
    
      def followers
        @title = "Followers"
        @user = User.find(params[:id])
        @users = @user.followers.paginate(page: params[:page])
        render 'show_follow'
      end
    
      private
    
        def correct_user
          @user = User.find(params[:id])
          redirect_to(root_path) unless current_user?(@user)
        end
    
        def admin_user
          redirect_to(root_path) unless current_user.admin?
        end
    end
    
    class UsersController
    从错误中可以看出,def show下的micropost_controller.rb文件中似乎没有初始化@micropost。但我想是吗?我做错了什么?谢谢

    这里还有app/views/users/show.html.erb

    <% provide(:title, @user.name) %>
    <div class="row">
      <aside class="span4">
        <section>
          <h1>
            <%= gravatar_for @user %>
            <%= @user.name %>
          </h1>
        </section>
      </aside>
      <div class="span8">
        <%= render 'follow_form' if signed_in? %>
        <% if @user.microposts.any? %>
          <h3>Microposts (<%= @user.microposts.count %>)</h3>
          <ol class="microposts">
            <%= render @microposts %>
          </ol>
          <%= will_paginate @microposts %>
        <% end %>
      </div>
    </div>
    
    
    微孔()
    
    我怀疑错误在您的部分代码中:

    <% @micropost.comments.each do |comment| %>
    
    
    
    我假设您正在迭代@micropost,并将每个micropost作为micropost传递给您的分部。在上面的一行中,您使用的是实例变量@micropost,而您应该使用本地micropost

    更新:还有这里:

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

    我怀疑错误在您的部分代码中:

    <% @micropost.comments.each do |comment| %>
    
    
    
    我假设您正在迭代@micropost,并将每个micropost作为micropost传递给您的分部。在上面的一行中,您使用的是实例变量@micropost,而您应该使用本地micropost

    更新:还有这里:

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

    您能否尝试将此
    @micropost=@user.micropost.paginate(page:params[:page])
    更改为此
    @micropost=@user.micropost.first
    并查看它是否有效? 我认为既然部分是在用户的上下文中呈现的,那么就说明了为什么@microspost是nil


    这不是答案,我只是想评论一下,但我没有足够的声望点。

    你能试着把这个
    @microspost=@user.microspost.paginate(page:params[:page])
    改成这个
    @microspost=@user.microspost.first
    ,看看它是否有效吗? 我认为既然部分是在用户的上下文中呈现的,那么就说明了为什么@microspost是nil

    这不是答案,我只是想评论一下