devise_invitable - 在DeviseInvitable控制器

时间:2016-02-22 09:58:26

标签: ruby-on-rails devise devise-invitable

我正在写一个Rails引擎(订阅),它将成为多租户Rails应用程序的基础,并处理子域,帐户,用户(使用Devise)和订阅。

除了devise_invitable Devise :: InvitationsController呈现应用程序布局之外,一切正常。发生这种情况时,布局渲染会因以下错误而崩溃: 未定义的局部变量或方法`destroy_user_session_path'

我不知道为什么url助手在这种情况下不可用,因为它们似乎可用于其余的应用程序。

应用程序布局仍然可以访问Devise变量,例如current_user,如果我删除了 destroy_user_session_path 的链接,则邀请#new action会使布局正常。

在虚拟应用程序(spec / dummy)中运行“rake routes”会正确显示路由。我也尝试了以下内容:

  • 使用pry并在应用程序布局本身内使用“binding.pry”插入断点。 “show-routes”仍然正确显示路线。
  • 使用我自己的控制器覆盖Devise :: InvitationsController并手动包含Rails URL帮助程序无效。

配置/ routes.rb中

require 'subscribe/constraints/subdomain_required'
require 'subscribe/constraints/no_subdomain'

Subscribe::Engine.routes.draw do

  constraints Subscribe::Constraints::SubdomainRequired do
    scope module: "account" do
      root to: "dashboard#index", as: :account_root
    end

  devise_for :users, 
    class_name: "Subscribe::User", 
    module: :devise, 
    path: "/",
    :controllers => { :invitations => 'subscribe/user_invitations' }

  resources :users

end

spec / dummy:'rake routes'

Routes for Subscribe::Engine:
          account_root GET    /                            subscribe/account/dashboard#index
      new_user_session GET    /sign_in(.:format)           devise/sessions#new
          user_session POST   /sign_in(.:format)           devise/sessions#create
  destroy_user_session DELETE /sign_out(.:format)          devise/sessions#destroy
         user_password POST   /password(.:format)          devise/passwords#create
     new_user_password GET    /password/new(.:format)      devise/passwords#new
    edit_user_password GET    /password/edit(.:format)     devise/passwords#edit
                       PATCH  /password(.:format)          devise/passwords#update
                       PUT    /password(.:format)          devise/passwords#update
accept_user_invitation GET    /invitation/accept(.:format) subscribe/user_invitations#edit
remove_user_invitation GET    /invitation/remove(.:format) subscribe/user_invitations#destroy
       user_invitation POST   /invitation(.:format)        subscribe/user_invitations#create
   new_user_invitation GET    /invitation/new(.:format)    subscribe/user_invitations#new
                       PATCH  /invitation(.:format)        subscribe/user_invitations#update
                       PUT    /invitation(.:format)        subscribe/user_invitations#update
                 users GET    /users(.:format)             subscribe/users#index
                       POST   /users(.:format)             subscribe/users#create
              new_user GET    /users/new(.:format)         subscribe/users#new
             edit_user GET    /users/:id/edit(.:format)    subscribe/users#edit
                  user GET    /users/:id(.:format)         subscribe/users#show
                       PATCH  /users/:id(.:format)         subscribe/users#update
                       PUT    /users/:id(.:format)         subscribe/users#update
                       DELETE /users/:id(.:format)         subscribe/users#destroy

配置/初始化/ devise.rb

config.parent_controller = 'Subscribe::ApplicationController'
config.router_name = :subscribe
config.scoped_views = true

规格/虚设/应用/视图/布局/ application.html.slim

doctype html
html
  head
    title
    = javascript_include_tag "application", "data-turbolinks-track" => true
    = csrf_meta_tags
  body
    - flash.each do |k,v|
      div class = "flash #{k}"
        = v
    br

    - binding.pry
    - if user_signed_in?
      = "Signed in as #{current_user.email}"
      = link_to "Sign out", destroy_user_session_path, method: :delete 
    -  else
      = "Not signed in"
    br

    == yield

应用/控制器/订阅/ user_invitations_controller.rb

module Subscribe
  class UserInvitationsController < Devise::InvitationsController
    include Rails.application.routes.url_helpers
    include Rails.application.routes.mounted_helpers

    def new
        #binding.pry
        super
    end

  end
end

subscribe.gemspec

$:.push File.expand_path("../lib", __FILE__)

# Maintain your gem's version:
require "subscribe/version"

# Describe your gem and declare its dependencies:
Gem::Specification.new do |s|
  s.name        = "subscribe"
  s.version     = Subscribe::VERSION
  s.authors     = ["author"]
  s.email       = ["author@example.com"]
  s.homepage    = "https://.com"
  s.summary     = "Subscriber engine for .com"
  s.description = "..."

  s.files = Dir["{app,config,db,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.rdoc"]

  #Framework
  s.add_dependency "rails", "~> 4.1.0"

  #Auth
  s.add_dependency "devise", "~>3.5.0"
  s.add_dependency "devise_invitable", "~>1.5.5"
  s.add_dependency "pundit", "~>0.2.3"

  #Layout and interface
  s.add_dependency "slim-rails", "~> 2.1.2"
  s.add_dependency "jquery-rails", "~> 3.1.4"

  #Testing
  s.add_development_dependency "rspec-rails", "~> 3.0.0"
  s.add_development_dependency "capybara", "~> 2.3.0"
  s.add_development_dependency "capybara-screenshot", "~> 0.3.17"
  s.add_development_dependency "factory_girl_rails", "~> 4.4.1"
  s.add_development_dependency "database_cleaner", "~> 1.2.0"

  #Tools and support
  s.add_development_dependency "spring", "~> 1.1.3"
  s.add_development_dependency "spring-commands-rspec"
  s.add_development_dependency "sqlite3"

  s.add_development_dependency "better_errors"
  s.add_development_dependency "binding_of_caller"
  s.add_development_dependency "pry-rails"
  #s.add_development_dependency "guard-rspec" - does not work atm
  s.add_development_dependency "rb-inotify"
  s.add_development_dependency "libnotify"

end

应用/控制器/订阅/ application_controller.rb

module Subscribe
  class ApplicationController < ActionController::Base
    layout "application"
    protect_from_forgery with: :exception    
  end
end

可在此处找到当前正在进行的工作的完整来源(README.md已过时):

https://github.com/heliohm/Subscribe

1 个答案:

答案 0 :(得分:0)

在Devise控制器的上下文中,似乎必须使用引擎名称命名路径。

使用 subscribe.destroy_user_session_path 更改 destroy_user_session_path 可以解决问题。

由于引擎是命名空间,因此还需要覆盖devise_invitable包含的默认视图(例如app / views / devise / mailer / invitation_instructions.html.erb),因为它们使用 root_url 在这种情况下不存在。

所有Devise控制器也是如此,例如: Devise SessionsController也不会在顶级名称空间中找到这些路由。