我正在写一个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”会正确显示路由。我也尝试了以下内容:
配置/ 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已过时):
答案 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也不会在顶级名称空间中找到这些路由。