【问题标题】:rails tutorial ch 2 error noMethodError: undefined method 'micropost'rails tutorial ch 2 error noMethodError: undefined method 'micropost'
【发布时间】:2013-06-24 05:06:28
【问题描述】:

我是一名新的 RoR,正在完成 railstutorial:第 2 章。

我使用的是 Ubuntu 12.04 LTS,使用 Sublime Text 2 进行虚拟化。我使用终端作为我的命令提示符。

http://ruby.railstutorial.org/ruby-on-rails-tutorial-book

我经历了一些尝试和错误,但现在我被难住了。

我正在开发 Demo_app 并卡在图 2.3.3 我已经测试了我的 localhost:3000 并且 /users/ 和 /microposts/ 页面都已生成,并且一切正常。即新建、编辑、销毁等。

我已经完成了用户和 micropost rake,“bundle exec rake db:migrate”,显然更新了数据模型。

我现在通过在终端中输入“ruby 控制台”来进入 ruby​​ 控制台 完成后我得到 1.9.1:001 > first_user = User.first ,响应是, 用户负载 (0.1ms) SELECT "users".* FROM "users" LIMIT 1

=> #

我现在明白了

 1.9.1 :002 > and I type first_user.microposts

这是我使用包含的命令得到的错误

1.9.1 :001 > first_user = User.first
  User Load (0.1ms)  SELECT "users".* FROM "users" LIMIT 1
 => #<User id: 1, name: "User Name", email: "example@example.com", created_at: "2013-06-23 23:17:01", updated_at: "2013-06-23 23:17:01"> 
1.9.1 :002 > first_user.microposts
NoMethodError: undefined method `microposts' for #<User:0xa6e8afc>
    from /home/user/rails_projects/demo_app/vendor/bundle/ruby/1.9.1/gems/activemodel-3.2.13/lib/active_model/attribute_methods.rb:407:in `method_missing'
    from /home/user/rails_projects/demo_app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.13/lib/active_record/attribute_methods.rb:149:in `method_missing'
    from (irb):2
    from /home/user/rails_projects/demo_app/vendor/bundle/ruby/1.9.1/gems/railties-3.2.13/lib/rails/commands/console.rb:47:in `start'
    from /home/user/rails_projects/demo_app/vendor/bundle/ruby/1.9.1/gems/railties-3.2.13/lib/rails/commands/console.rb:8:in `start'
    from /home/user/rails_projects/demo_app/vendor/bundle/ruby/1.9.1/gems/railties-3.2.13/lib/rails/commands.rb:41:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

我想我也会发布我认为可能与错误有关的其他文件。

我的微博.rb

    class Micropost < ActiveRecord::Base
    attr_accessible :content, :user_id

   belongs_to :user

   validates :content, :length => { :maximum => 140 }
   end

我的 users_controller.rb

    class UsersController < ApplicationController
      # GET /users
      # GET /users.json
      def index
    @users = User.all

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @users }
    end
  end

  # GET /users/1
  # GET /users/1.json
  def show
    @user = User.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @user }
    end
  end

  # GET /users/new
  # GET /users/new.json
  def new
    @user = User.new

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @user }
    end
  end

  # GET /users/1/edit
  def edit
    @user = User.find(params[:id])
  end

  # POST /users
  # POST /users.json
  def create
    @user = User.new(params[:user])

    respond_to do |format|
      if @user.save
        format.html { redirect_to @user, notice: 'User was successfully created.' }
        format.json { render json: @user, status: :created, location: @user }
      else
       format.html { render action: "new" }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
     end
  end

  # PUT /users/1
  # PUT /users/1.json
  def update
    @user = User.find(params[:id])

    respond_to do |format|
     if @user.update_attributes(params[:user])
       format.html { redirect_to @user, notice: 'User was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /users/1
  # DELETE /users/1.json
  def destroy
    @user = User.find(params[:id])
    @user.destroy

    respond_to do |format|
      format.html { redirect_to users_url }
      format.json { head :no_content }
     end
  end
end

我的 user.rb 文件

class User < ActiveRecord::Base
    attr_accessible :email, :name
    has_many :microposts
end

我的 index.html.erb 文件

  </tr>

<% @users.each do |user| %>
   <tr>
    <td><%= user.name %></td>
    <td><%= user.email %></td>
    <td><%= link_to 'Show', user %></td>
    <td><%= link_to 'Edit', edit_user_path(user) %></td>
    <td><%= link_to 'Destroy', user, method: :delete, data: { confirm: 'Are you     sure?'     } %></td>
  </tr>
<% end %>
</table>

<br />

<%= link_to 'New User', new_user_path %>

我的路线.rb

DemoApp::Application.routes.draw do
  resources :microposts


  resources :users

#...
end

我猜是我的 Gemfile

source 'https://rubygems.org'

gem 'rails', '3.2.13'

group :development do
    gem 'sqlite3', '1.3.5'
end
# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'

# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails',   '3.2.5'
  gem 'coffee-rails', '3.2.2'

  # See https://github.com/sstephenson/execjs#readme for more supported runtimes
  # gem 'therubyracer', :platforms => :ruby

  gem 'uglifier', '1.2.3'
end

gem 'jquery-rails', '2.0.2'

group :production do
    gem 'pg', '0.12.2'
end

我所知道的唯一复杂情况是在阅读本教程时在 2.1 上使用命令

捆绑更新

然后

捆绑安装 -- 不生产

我必须扭转这个过程才能使更新正常工作...我查看了 stackoverflow 并发现了其他一些解决方法...也许是这样或以某种方式设置服务器或原始 gem,红宝石,导轨安装。

感谢您的帮助,如果我没有正确发布此内容,我会采纳建议。

Tkin1

【问题讨论】:

  • 转到项目根目录,然后重新启动控制台。一切似乎都很好,只要确保启动控制台你必须使用 rails console Rails c
  • 不幸的是,我尝试这样做并使用 cntrl d 关闭控制台。我还删除了 repo re 脚手架并再次启动了服务器几次。也许您还有其他建议可以帮助您找到问题的根源?
  • 你能分享你的代码仓库吗?
  • 是的,等一下,让我提交。

标签: ruby-on-rails ruby-on-rails-3.2 railstutorial.org


【解决方案1】:

你的用户模型看起来像

class User < ActiveRecord::Base
  attr_accessible :email, :name
end

没有定义关联。制作它:

class User < ActiveRecord::Base
  attr_accessible :email, :name
  has_many: :microposts
end

您在帖子中提到了它,但它没有反映您的代码

【讨论】:

  • 好吧,也许我已经在这个最新的部署中,因为我试图修复错误,我会试试这个并让你知道。一会儿……
  • 是的!我非常激动。我没有做的是保存在 Sublime Text 中,而是关闭了编辑器。我认为这将解决我的一大堆问题。谢谢,如果我有声望,我会投票赞成,也许其他人会投票。
  • 我会代表你 +1 :)
  • 谢谢!我很感激。
【解决方案2】:

在我的情况下,问题是我在启动 rails console 时没有保存 user.rbmicropost.rb

我通过退出 rails console、保存两个模型文件并重新启动 rails console 解决了这个问题。

在不重启rails console的情况下保存模型文件是不够的。

【讨论】:

  • 哈哈,对我来说,我只需要按 ctrl-c 退出轨道控制台并重新启动轨道控制台。
【解决方案3】:

我遇到了同样的错误,以下是修复它的方法: 进入关联时不要跟着书本,而是输入

has_many :Micropost 

belongs_to: User

请注意,“Micropost”和“User”都是大写,而“Micropost”单数不是复数

【讨论】:

    【解决方案4】:

    我确定你现在已经有了答案,但我发现我的问题是,是这样吗?

    我没有运行第二个bundle exec rake db:migrate,它修复了错误。

    【讨论】:

      【解决方案5】:

      这是我解决问题的方法。

      1) 仔细检查您的 micropost.rb 和 user.rb。

      我有一个拼写问题需要纠正。

      2) 删除旧帖子,创建新帖子

      如果您使用旧配置创建记录,我认为这会导致问题。我删除了我的帖子(使用应用程序),然后为用户 1 创建了一些新帖子。在此之后,我能够运行 rails 控制台命令。

      祝你好运!

      【讨论】:

        【解决方案6】:

        我不得不再次运行rails server 来重新启动rails miniserver。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-20
          • 2011-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-24
          相关资源
          最近更新 更多