Fix generator command for nested (namespaced) rails engine

If we create nested (namespaced) rails engine such like bukkits-admin,
`bin/rails g scaffold User name:string age:integer`
will create
`bukkits-admin/app/controllers/bukkits/users_controller.rb`
but it should create
`bukkits-admin/app/controllers/bukkits/admin/users_controller.rb`.

In #6643, we changed `namespaced_path` as root path
because we supposed application_controller is always in root
but nested rails engine's application_controller will not.
This commit is contained in:
Fumiaki MATSUSHIMA 2016-12-22 19:21:11 +09:00
parent 33e60514ae
commit 085546df45
9 changed files with 29 additions and 9 deletions

View File

@ -26,7 +26,7 @@ module Rails
def application_mailer_file_name def application_mailer_file_name
@_application_mailer_file_name ||= if mountable_engine? @_application_mailer_file_name ||= if mountable_engine?
"app/mailers/#{namespaced_path}/application_mailer.rb" File.join("app/mailers", namespaced_path, "application_mailer.rb")
else else
"app/mailers/application_mailer.rb" "app/mailers/application_mailer.rb"
end end

View File

@ -28,7 +28,7 @@ module Rails # :nodoc:
private private
def application_job_file_name def application_job_file_name
@application_job_file_name ||= if mountable_engine? @application_job_file_name ||= if mountable_engine?
"app/jobs/#{namespaced_path}/application_job.rb" File.join("app/jobs", namespaced_path, "application_job.rb")
else else
"app/jobs/application_job.rb" "app/jobs/application_job.rb"
end end

View File

@ -59,7 +59,7 @@ module ActiveRecord
def application_record_file_name def application_record_file_name
@application_record_file_name ||= if mountable_engine? @application_record_file_name ||= if mountable_engine?
"app/models/#{namespaced_path}/application_record.rb" File.join("app/models", namespaced_path, "application_record.rb")
else else
"app/models/application_record.rb" "app/models/application_record.rb"
end end

View File

@ -95,11 +95,11 @@ module Rails
end end
def namespaced_class_path # :doc: def namespaced_class_path # :doc:
@namespaced_class_path ||= [namespaced_path] + @class_path @namespaced_class_path ||= namespaced_path + @class_path
end end
def namespaced_path # :doc: def namespaced_path # :doc:
@namespaced_path ||= namespace.name.split("::").first.underscore @namespaced_path ||= namespace.name.split("::").map(&:underscore)
end end
def class_name # :doc: def class_name # :doc:

View File

@ -1,5 +1,5 @@
<% if namespaced? -%> <% if namespaced? -%>
require_dependency "<%= namespaced_path %>/application_controller" require_dependency "<%= File.join(namespaced_path) %>/application_controller"
<% end -%> <% end -%>
<% module_namespacing do -%> <% module_namespacing do -%>

View File

@ -1,5 +1,5 @@
<% if namespaced? -%> <% if namespaced? -%>
require_dependency "<%= namespaced_path %>/application_controller" require_dependency "<%= File.join(namespaced_path) %>/application_controller"
<% end -%> <% end -%>
<% module_namespacing do -%> <% module_namespacing do -%>

View File

@ -1,5 +1,5 @@
<% if namespaced? -%> <% if namespaced? -%>
require_dependency "<%= namespaced_path %>/application_controller" require_dependency "<%= File.join(namespaced_path) %>/application_controller"
<% end -%> <% end -%>
<% module_namespacing do -%> <% module_namespacing do -%>

View File

@ -22,7 +22,7 @@ module TestUnit # :nodoc:
def fixture_name def fixture_name
@fixture_name ||= @fixture_name ||=
if mountable_engine? if mountable_engine?
"%s_%s" % [namespaced_path, table_name] "%s_%s" % [namespaced_path.join("_"), table_name]
else else
table_name table_name
end end

View File

@ -492,6 +492,26 @@ class ScaffoldGeneratorTest < Rails::Generators::TestCase
end end
end end
def test_scaffold_tests_pass_by_default_inside_namespaced_mountable_engine
Dir.chdir(destination_root) { `bundle exec rails plugin new bukkits-admin --mountable` }
engine_path = File.join(destination_root, "bukkits-admin")
Dir.chdir(engine_path) do
quietly do
`bin/rails g scaffold User name:string age:integer;
bin/rails db:migrate`
end
assert_file "bukkits-admin/app/controllers/bukkits/admin/users_controller.rb" do |content|
assert_match(/module Bukkits::Admin/, content)
assert_match(/class UsersController < ApplicationController/, content)
end
assert_match(/8 runs, 10 assertions, 0 failures, 0 errors/, `bin/rails test 2>&1`)
end
end
def test_scaffold_tests_pass_by_default_inside_full_engine def test_scaffold_tests_pass_by_default_inside_full_engine
Dir.chdir(destination_root) { `bundle exec rails plugin new bukkits --full` } Dir.chdir(destination_root) { `bundle exec rails plugin new bukkits --full` }