NameError / undefined局部变量或方法

时间:2015-12-05 15:14:26

标签: ruby-on-rails ruby

我正在尝试将我的帖子模型放在另一个控制器中。以下是概念和资源:

  1. 索引控制器,其中包含home/about...等方法,使网址看起来像www.xxxx.com/index/home
  2. 使用户即将发布文章的帖子模型。
  3. 设备gem。
  4. 当我运行以下代码时,

    • views/index/home.html.erb

      <%= render  "posts/post" %>
      
    • views/posts/_post.html.erb

      <li id="post-<%= post.id %>">    
        <span class="user"><%= link_to post.user.name, post.user %></span>
        <span class="content"><%= post.content %></span>
      </li>
      
    • models/post.rb

      class Post < ActiveRecord::Base
        belongs_to :user
        validates :content, presence: true
      end
      
    • controllers/posts_controller.rb

      class PostsController < ApplicationController 
        def show
          @user = User.find(params[:id])
          @posts = @user.posts 
        end
      end
      

    显示错误:

    NameError` in `Index#home
    Showing /home/ubuntu/workspace/app/views/posts/_post.html.erb where line #1 raised:
    undefined local variable or method `post' for #<#<Class:0x007f105a04f7d8>:0x007f1058676d48>
    Extracted source (around line #1):
    1<li id="post-<%= post.id %>">
    

    @post@posts似乎不是问题的根源,因为我已多次尝试过。

1 个答案:

答案 0 :(得分:0)

您的错误意味着此时没有名为post的变量。确实可以在视图中设置变量,但如果您希望从控制器获取某些内容,那么您就不幸了。在rails中,您通常会设置实例变量(如@post@posts)以与视图进行通信。对我而言,您似乎错过了render电话周围的循环。另外 - 你没有将实际的post传入部分。在home.html.erb中你可能需要像

这样的东西
<% @posts.each do |post| %>
  <%= render post %>
<% end %>

实际上将任何帖子发送到您的部分。