从gem添加Rails控制器

rog*_*iog 13 ruby rubygems ruby-on-rails ruby-on-rails-3

我开发Rails应用程序特别是一个rubygem,我想从我的宝石加控制器,使其可在Rails应用程序(类似于设计确实与RegistrationsController,SessionsController).

在宝石方面:

我尝试添加以下app/controllers/samples_controller.rb

class SamplesController < ApplicationController
  def index
    .
    .
  end
end
Run Code Online (Sandbox Code Playgroud)

然后在我的rails路线上添加它:

match 'route' => 'samples#index'
Run Code Online (Sandbox Code Playgroud)

要么

resources :samples
Run Code Online (Sandbox Code Playgroud)

显然我在那里遇到了一些问题,但我不知道它是什么?我是否需要在某处明确要求我的SampleController或应用程序上的初始化程序?

现在我在访问路线时遇到此错误

uninitialized constant SamplesController
Run Code Online (Sandbox Code Playgroud)

谢谢 :)

Ket*_*kar 21

假设您的gem名为MyGem,并且您有一个名为SamplesController的控制器,您想在应用程序中使用它.您的控制器应定义为:

module MyGem
  class SamplesController < ApplicationController
    def whatever
      ...
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

在你的gem目录中,它应该存在app/controllers/my_gem/samples_controller.rb(不在lib文件夹下).

然后使用代码在gems lib/my_gem文件夹中创建engine.rb

module MyGem
  class Engine < Rails::Engine; end
end
Run Code Online (Sandbox Code Playgroud)

您可以通过在config文件夹中使用代码创建routes.rb来编写gem中的路由

# my_gem/config/routes.rb
Rails.application.routes.draw do
  match 'route' => 'my_gem/samples#index'
end
Run Code Online (Sandbox Code Playgroud)

最终的结构是这样的

## DIRECTORY STRUCTURE
#

- my_gem/
  - app/
    - controllers/
      - my_gem/
        + samples_controller.rb
  - config/
    + routes.rb
  - lib/
    - my_gem.rb
    - my_gem/
      + engine.rb
      + version.rb
  + my_gem.gemspec
  + Gemfile
  + Gemfile.lock
Run Code Online (Sandbox Code Playgroud)

而已.

  • 大多数是正确的,还有一件事:将`require'my_gem/engine'添加到`lib/my_gem.rb` (3认同)
  • `./lib/my_gem/engine.rb` 的用途是什么? (3认同)

Agi*_*gis 0

首先,您的代码中有一个拼写错误:AppicationController应该是ApplicationController

那么,您没有遵循 Rails 命名约定(资源等的复数形式):

  • 在您的路线中,它必须是resources :samplesresource :sample
  • 你的控制器类应该class SamplesController
  • 控制器的文件名应该是samples_controller.rb.

遵循惯例,你应该没问题。