From 85a8bc644be69908f05740a5886ec19cd3679df5 Mon Sep 17 00:00:00 2001
From: "yuuji.yaginuma" <yuuji.yaginuma@gmail.com>
Date: Sat, 4 May 2019 09:14:10 +0900
Subject: Make generated test work even when using virtual attributes

The virtual attributes(`attachment` and `rich_text`) can't set value
with `fill_in`. So avoid using it. Once #35885 is merged, will be
modified to use it.

Also, add checking attachment attached or not for avoiding
`DelegationError` when attachment didn't attach.
---
 .../rails/generators/erb/scaffold/templates/show.html.erb.tt |  2 +-
 railties/lib/rails/generators/named_base.rb                  |  1 -
 .../scaffold_controller/scaffold_controller_generator.rb     | 12 +++++++++---
 .../generators/test_unit/scaffold/scaffold_generator.rb      |  9 +++++++--
 4 files changed, 17 insertions(+), 7 deletions(-)

(limited to 'railties/lib')

diff --git a/railties/lib/rails/generators/erb/scaffold/templates/show.html.erb.tt b/railties/lib/rails/generators/erb/scaffold/templates/show.html.erb.tt
index 6b216001d2..d3f996188c 100644
--- a/railties/lib/rails/generators/erb/scaffold/templates/show.html.erb.tt
+++ b/railties/lib/rails/generators/erb/scaffold/templates/show.html.erb.tt
@@ -4,7 +4,7 @@
 <p>
   <strong><%= attribute.human_name %>:</strong>
 <% if attribute.attachment? -%>
-  <%%= link_to @<%= singular_table_name %>.<%= attribute.column_name %>.filename, @<%= singular_table_name %>.<%= attribute.column_name %> %>
+  <%%= link_to @<%= singular_table_name %>.<%= attribute.column_name %>.filename, @<%= singular_table_name %>.<%= attribute.column_name %> if @<%= singular_table_name %>.<%= attribute.column_name %>.attached? %>
 <% elsif attribute.attachments? -%>
   <%% @<%= singular_table_name %>.<%= attribute.column_name %>.each do |<%= attribute.singular_name %>| %>
     <div><%%= link_to <%= attribute.singular_name %>.filename, <%= attribute.singular_name %> %></div>
diff --git a/railties/lib/rails/generators/named_base.rb b/railties/lib/rails/generators/named_base.rb
index 42e64cd11f..d6732f8ff1 100644
--- a/railties/lib/rails/generators/named_base.rb
+++ b/railties/lib/rails/generators/named_base.rb
@@ -187,7 +187,6 @@ module Rails
 
         def attributes_names # :doc:
           @attributes_names ||= attributes.each_with_object([]) do |a, names|
-            next if a.attachments?
             names << a.column_name
             names << "password_confirmation" if a.password_digest?
             names << "#{a.name}_type" if a.polymorphic?
diff --git a/railties/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb b/railties/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb
index 8b46eb88ae..e1ca54ec91 100644
--- a/railties/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb
+++ b/railties/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb
@@ -36,9 +36,15 @@ module Rails
       private
 
         def permitted_params
-          params = attributes_names.map { |name| ":#{name}" }.join(", ")
-          params += attributes.select(&:attachments?).map { |a| ", #{a.name}: []" }.join
-          params
+          attachments, others = attributes_names.partition { |name| attachments?(name) }
+          params = others.map { |name| ":#{name}" }
+          params += attachments.map { |name| "#{name}: []" }
+          params.join(", ")
+        end
+
+        def attachments?(name)
+          attribute = attributes.find { |attr| attr.name == name }
+          attribute&.attachments?
         end
     end
   end
diff --git a/railties/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb b/railties/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb
index 6df50c3217..26002a0704 100644
--- a/railties/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb
+++ b/railties/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb
@@ -49,16 +49,21 @@ module TestUnit # :nodoc:
           attributes_names.map do |name|
             if %w(password password_confirmation).include?(name) && attributes.any?(&:password_digest?)
               ["#{name}", "'secret'"]
-            else
+            elsif !virtual?(name)
               ["#{name}", "@#{singular_table_name}.#{name}"]
             end
-          end.sort.to_h
+          end.compact.sort.to_h
         end
 
         def boolean?(name)
           attribute = attributes.find { |attr| attr.name == name }
           attribute&.type == :boolean
         end
+
+        def virtual?(name)
+          attribute = attributes.find { |attr| attr.name == name }
+          attribute&.virtual?
+        end
     end
   end
 end
-- 
cgit v1.2.3