为啥“rails s”不能从应用程序目录工作?

Posted

技术标签:

【中文标题】为啥“rails s”不能从应用程序目录工作?【英文标题】:Why doesn't "rails s" work from the app directory?为什么“rails s”不能从应用程序目录工作? 【发布时间】:2013-07-12 18:35:17 【问题描述】:

我在我的 app 文件夹中,但命令 rails s 不起作用。我阅读了很多关于 Stack Overflow 的帖子,其中大部分似乎来自不在其应用目录中的用户。

此外,我还构建了一些其他应用程序。我检查了这些,Rails 服务器适用于所有这些应用程序。这是唯一一个我无法启动它的地方。

which rails的输出:

/Users/jmcrist/.rvm/gems/ruby-2.0.0-p247/bin/rails

rails s 的输出:

MacBook-Pro:first_app jmcrist$ rails s
Usage:
  rails new APP_PATH [options]

Options:
  -r, [--ruby=PATH]              # Path to the Ruby binary of your choice
                                 # Default: /Users/jmcrist/.rvm/rubies/ruby-2.0.0-p247/bin/ruby
  -b, [--builder=BUILDER]        # Path to a application builder (can be a filesystem path or URL)
  -m, [--template=TEMPLATE]      # Path to an application template (can be a filesystem path or URL)
      [--skip-gemfile]           # Don't create a Gemfile
      [--skip-bundle]            # Don't run bundle install
  -G, [--skip-git]               # Skip Git ignores and keeps
  -O, [--skip-active-record]     # Skip Active Record files
  -S, [--skip-sprockets]         # Skip Sprockets files
  -d, [--database=DATABASE]      # Preconfigure for selected database (options: mysql/oracle/postgresql/sqlite3/frontbase/ibm_db/sqlserver/jdbcmysql/jdbcsqlite3/jdbcpostgresql/jdbc)
                                 # Default: sqlite3
  -j, [--javascript=JAVASCRIPT]  # Preconfigure for selected JavaScript library
                                 # Default: jquery
  -J, [--skip-javascript]        # Skip JavaScript files
      [--dev]                    # Setup the application with Gemfile pointing to your Rails checkout
      [--edge]                   # Setup the application with Gemfile pointing to Rails repository
  -T, [--skip-test-unit]         # Skip Test::Unit files
      [--old-style-hash]         # Force using old style hash (:foo => 'bar') on Ruby >= 1.9

Runtime options:
  -f, [--force]    # Overwrite files that already exist
  -p, [--pretend]  # Run but do not make any changes
  -q, [--quiet]    # Suppress status output
  -s, [--skip]     # Skip files that already exist

Rails options:
  -h, [--help]     # Show this help message and quit
  -v, [--version]  # Show Rails version number and quit

Description:
    The 'rails new' command creates a new Rails application with a default
    directory structure and configuration at the path you specify.

    You can specify extra command-line arguments to be used every time
    'rails new' runs in the .railsrc configuration file in your home directory.

    Note that the arguments specified in the .railsrc file don't affect the
    defaults values shown above in this help message.

Example:
    rails new ~/Code/Ruby/weblog

    This generates a skeletal Rails installation in ~/Code/Ruby/weblog.
    See the README in the newly created application to get going.

我正在阅读 Hartl 的 Rails 教程,他对 gemfile 做了很多修改。我想知道这是否可能是原因?

source 'https://rubygems.org'

gem 'rails', '3.2.13'

group :development do
  gem 'sqlite3', '1.3.5'
end


# 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'

  gem 'uglifier', '1.2.3'
end

gem 'jquery-rails', '2.0.2'

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

【问题讨论】:

命令 rails 服务器是否工作?编辑~查看SO中的其他类似问题,可能是因为您尚未安装或更新您的gem,请尝试进行捆绑安装或捆绑更新 命令行中pwd的输出是什么? /Users/jmcrist/rails_projects/first_app Althaf:感谢您的反馈。我运行了 bundle install,然后再次运行了“rails s”。我收到了同样的错误。 rails 服务器是否工作。 【参考方案1】:

似乎认为您不在 rails 目录中(您的输出表明使用 rails 的唯一有效方法是使用 rails new)。

根据您的版本,Rails 会以不同的方式识别这一点。在 3.2 上,它会检查位于 script/rails 的文件。现在 4.0 已经发布,它会查找 script/railsbin/rails (https://github.com/rails/rails/blob/207fa5c11ddf1cfd696f0eeb07d6466aae9d451e/railties/lib/rails/app_rails_loader.rb#L6)

大概您可以通过在您的script 目录中创建文件rails 来解决此问题(如果您没有script 目录,请在您的应用的根目录中创建一个):

#!/usr/bin/env ruby
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.

APP_PATH = File.expand_path('../../config/application',  __FILE__)
require File.expand_path('../../config/boot',  __FILE__)
require 'rails/commands'

当然,值得想知道为什么您一开始就没有这个文件。可能值得确保您的 rails 是您首先要使用的版本(rails -v 如果版本较新,this 帖子将向您展示如何使用旧版本创建新应用程序)。

【讨论】:

你说得对——我使用了错误的 Rails 版本。我正在关注 Michael Hartl 的教程,无论出于何种原因,当我离开并在一段时间后回到它时,我不小心选择了 Rails 3.2 版本。感谢您的帮助! 谢谢!我使用的应用程序最初是一个 Rails 4 应用程序,但最终降级了。因此,bin/rails 文件夹丢失了,我使用 pow,所以在我想使用控制台之前,问题是不可见的。一直在挠头,重建 rvm gemsets 和各种各样的东西,直到我看到这个! 谢谢!这节省了一天。 作为一个 Rails 新手,我刚刚删除了 scripts 文件夹。添加后它就像一个魅力。当然。【参考方案2】:

可能的原因:

您不在包含完整 Rails 应用程序的目录中 你的bin 目录可能我是空的,尝试运行rake rails:update:bin(Rails 4)或rails app:update:bin(Rails 5)

【讨论】:

我用spring binstub -all弄乱了我的bin目录这为我恢复了它。 我把目录放到bin里面了,记得放到git上 为我工作。谢谢! 实际上是 rake app:update:bin 为我正在使用的 Rails 5.1.3 应用程序工作,而不是 rails app:update:bin。否则,效果很好。谢谢!【参考方案3】:

以上所有答案都没有帮助我。解决Rails 4 问题的方法是在我的应用程序的根目录中运行命令:

rake rails:update:bin

之后,rails s 运行正常。

【讨论】:

【参考方案4】:

如果您使用 rvmrbenv 例如保留多个 ruby​​ 版本,则该特定 rails 版本的默认 rails 版本可能与您尝试运行的项目不同,因此它不是能够检测到您的应用程序。

为确保您使用的是正确的rails 版本,您可以比较两个结果。这就是我所拥有的:

$ rails -v
Rails 3.1.0

$ bundle exec rails -v
Rails 5.0.0.1

在这种情况下,您可以保留默认的rails 版本,然后使用:

$ bundle exec rails server

或者将特定的rails gem 安装到那个非常ruby 版本:

$ gem install rails -v 5.0.0.1
$ rails -v
Rails 5.0.0.1

然后使用不那么冗长的命令让它工作:

$ rails s

我希望这对处于相同情况的其他人有所帮助!

【讨论】:

【参考方案5】:

您可能还没有捆绑您的宝石:

# from command line
bundle install

【讨论】:

zeantsoi:我试图这样做。不幸的是,它并没有解决问题:...Your bundle is complete! Gems in the group production were not installed. Use 'bundle show [gemname]' to see where a bundled gem is installed. MacBook-Pro:first_app jmcrist$ rails s Usage: rails new APP_PATH [options]... 我遇到了和 OP 一样的问题。捆绑包尚未在路径中。【参考方案6】:

我遇到了这个问题,我花了几分钟才意识到我忘记用 chruby 更改活动的 Ruby 版本。不同的 Ruby 意味着不同的 Rails 版本,它会在另一个文件夹中查找相关文件。

【讨论】:

【参考方案7】:

首先检查您的位置路径,然后

bundle install

如果还是不行,进入

/bin/bash --login
bundle install

【讨论】:

以上是关于为啥“rails s”不能从应用程序目录工作?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 css 不能在 localhost.3000 上应用?

Excel 宏:为啥不能保存在正确的目录中?

为啥我的 pygame 应用程序循环不能正常工作? [复制]

为啥我不能在 docker 中构建这个 nuxtjs 应用程序,而本地构建工作?

Xcode/Cocoapods 为啥我不能从 Pod 实现 Swift 协议?

当 XAMPP 不在分区的根目录中时,为啥它不能工作?