cas-cms 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (126) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +43 -0
  4. data/Rakefile +37 -0
  5. data/app/assets/config/cas_manifest.js +2 -0
  6. data/app/assets/images/cas/black-star.svg +4 -0
  7. data/app/assets/images/cas/check.svg +4 -0
  8. data/app/assets/images/cas/dropzone-in.svg +4 -0
  9. data/app/assets/images/cas/loading.gif +0 -0
  10. data/app/assets/images/cas/white-star.svg +4 -0
  11. data/app/assets/javascripts/cas/application.js +51 -0
  12. data/app/assets/javascripts/cas/fileupload_manifest.js +269 -0
  13. data/app/assets/javascripts/cas/plugins/cas_image_gallery.js +353 -0
  14. data/app/assets/javascripts/cas/vendor/file_upload/canvas-to-blob.min.js +2 -0
  15. data/app/assets/javascripts/cas/vendor/file_upload/jquery.fileupload-image.js +326 -0
  16. data/app/assets/javascripts/cas/vendor/file_upload/jquery.fileupload-process.js +178 -0
  17. data/app/assets/javascripts/cas/vendor/file_upload/jquery.fileupload.js +1482 -0
  18. data/app/assets/javascripts/cas/vendor/file_upload/jquery.iframe-transport.js +224 -0
  19. data/app/assets/javascripts/cas/vendor/file_upload/jquery.ui.widget.js +572 -0
  20. data/app/assets/javascripts/cas/vendor/file_upload/load-image.all.min.js +2 -0
  21. data/app/assets/javascripts/cas/vendor/jquery.ui.touch-punch.min.js +11 -0
  22. data/app/assets/javascripts/cas/vendor/selectize.min.js +3 -0
  23. data/app/assets/stylesheets/cas/application.sass +17 -0
  24. data/app/assets/stylesheets/cas/colors.sass +6 -0
  25. data/app/assets/stylesheets/cas/form.sass +99 -0
  26. data/app/assets/stylesheets/cas/layout.sass +68 -0
  27. data/app/assets/stylesheets/cas/mixins.sass +34 -0
  28. data/app/assets/stylesheets/cas/plugins/attachments_form.sass +16 -0
  29. data/app/assets/stylesheets/cas/plugins/image_gallery.sass +128 -0
  30. data/app/assets/stylesheets/cas/tables.sass +13 -0
  31. data/app/assets/stylesheets/cas/typography.sass +27 -0
  32. data/app/assets/stylesheets/cas/vendors/selectize.default.css +394 -0
  33. data/app/assets/stylesheets/cas/vendors/simplegrid.css +298 -0
  34. data/app/controllers/cas/api/files_controller.rb +88 -0
  35. data/app/controllers/cas/application_controller.rb +17 -0
  36. data/app/controllers/cas/devise/sessions_controller.rb +9 -0
  37. data/app/controllers/cas/file_uploads_controller.rb +14 -0
  38. data/app/controllers/cas/sections/application_controller.rb +23 -0
  39. data/app/controllers/cas/sections/categories_controller.rb +47 -0
  40. data/app/controllers/cas/sections/contents_controller.rb +144 -0
  41. data/app/controllers/cas/sections_controller.rb +7 -0
  42. data/app/controllers/cas/users_controller.rb +61 -0
  43. data/app/helpers/cas/application_helper.rb +4 -0
  44. data/app/helpers/cas/form_helper.rb +11 -0
  45. data/app/jobs/cas/application_job.rb +4 -0
  46. data/app/jobs/cas/images/delete_job.rb +11 -0
  47. data/app/jobs/cas/images/promote_job.rb +11 -0
  48. data/app/jobs/cas/increment_pageviews_job.rb +11 -0
  49. data/app/models/cas/application_record.rb +5 -0
  50. data/app/models/cas/category.rb +6 -0
  51. data/app/models/cas/content.rb +59 -0
  52. data/app/models/cas/media_file.rb +77 -0
  53. data/app/models/cas/section.rb +10 -0
  54. data/app/models/cas/site.rb +5 -0
  55. data/app/models/cas/user.rb +39 -0
  56. data/app/uploaders/file_uploader.rb +26 -0
  57. data/app/views/cas/devise/sessions/new.html.erb +24 -0
  58. data/app/views/cas/sections/categories/_form.html.erb +19 -0
  59. data/app/views/cas/sections/categories/edit.html.erb +5 -0
  60. data/app/views/cas/sections/categories/index.html.erb +28 -0
  61. data/app/views/cas/sections/categories/new.html.erb +5 -0
  62. data/app/views/cas/sections/contents/_form_attachments.html.erb +42 -0
  63. data/app/views/cas/sections/contents/_form_attachments_template.html.erb +11 -0
  64. data/app/views/cas/sections/contents/_form_for_content.html.erb +85 -0
  65. data/app/views/cas/sections/contents/_form_for_survey.html.erb +36 -0
  66. data/app/views/cas/sections/contents/_form_images.html.erb +86 -0
  67. data/app/views/cas/sections/contents/edit.html.erb +6 -0
  68. data/app/views/cas/sections/contents/index.html.erb +71 -0
  69. data/app/views/cas/sections/contents/new.html.erb +5 -0
  70. data/app/views/cas/sections/index.html.erb +21 -0
  71. data/app/views/cas/shared/_error_messages.html.erb +12 -0
  72. data/app/views/cas/users/_form.html.erb +11 -0
  73. data/app/views/cas/users/edit.html.erb +2 -0
  74. data/app/views/cas/users/index.html.erb +34 -0
  75. data/app/views/cas/users/new.html.erb +2 -0
  76. data/app/views/layouts/cas/application.html.erb +71 -0
  77. data/config/initializers/acts_as_taggable.rb +1 -0
  78. data/config/initializers/devise.rb +277 -0
  79. data/config/initializers/shrine.rb +50 -0
  80. data/config/initializers/simple_form.rb +169 -0
  81. data/config/locales/devise.en.yml +64 -0
  82. data/config/locales/pt-BR.yml +242 -0
  83. data/config/locales/simple_form.en.yml +31 -0
  84. data/config/routes.rb +31 -0
  85. data/db/migrate/20170129212144_create_cas_sites.rb +15 -0
  86. data/db/migrate/20170219172958_create_cas_sections.rb +12 -0
  87. data/db/migrate/20170219175007_create_cas_contents.rb +17 -0
  88. data/db/migrate/20170612204500_create_cas_users.rb +14 -0
  89. data/db/migrate/20170613174724_create_cas_media_files.rb +20 -0
  90. data/db/migrate/20170613175912_create_cas_categories.rb +14 -0
  91. data/db/migrate/20170614171928_add_columns_to_cas_contents.rb +12 -0
  92. data/db/migrate/20170614172904_add_column_to_cas_sections.rb +6 -0
  93. data/db/migrate/20170615235532_add_devise_to_cas_users.rb +49 -0
  94. data/db/migrate/20170616011202_remove_password_from_cas_users.rb +5 -0
  95. data/db/migrate/20170618014204_v3_migration_fields.rb +30 -0
  96. data/db/migrate/20170623182702_add_column_category_id_to_cas_content.rb +6 -0
  97. data/db/migrate/20170624024648_rename_url_to_path_in_files.rb +7 -0
  98. data/db/migrate/20170625192119_acts_as_taggable_on_migration.acts_as_taggable_on_engine.rb +36 -0
  99. data/db/migrate/20170625192120_add_missing_unique_indices.acts_as_taggable_on_engine.rb +26 -0
  100. data/db/migrate/20170625192121_add_taggings_counter_cache_to_tags.acts_as_taggable_on_engine.rb +20 -0
  101. data/db/migrate/20170625192122_add_missing_taggable_index.acts_as_taggable_on_engine.rb +15 -0
  102. data/db/migrate/20170625192123_change_collation_for_tag_names.acts_as_taggable_on_engine.rb +15 -0
  103. data/db/migrate/20170625192124_add_missing_indexes_on_taggings.acts_as_taggable_on_engine.rb +23 -0
  104. data/db/migrate/20170713210101_add_location_to_cas_content.rb +5 -0
  105. data/db/migrate/20170714043036_add_url_to_content.rb +5 -0
  106. data/db/migrate/20170718201535_add_embedded_to_content.rb +5 -0
  107. data/db/migrate/20170801171952_categories_with_jsonb_metadata.rb +6 -0
  108. data/db/migrate/20170801173256_add_published_at_to_cas_contents.rb +6 -0
  109. data/db/migrate/20170801175407_add_description_to_cas_categories.rb +5 -0
  110. data/db/migrate/20170830000000_add_data_search_extensions.rb +17 -0
  111. data/db/migrate/20170830000001_add_search_index_to_cas_contents.rb +20 -0
  112. data/db/migrate/20170830000002_use_uuid_with_acts_as_taggable_references.rb +17 -0
  113. data/db/migrate/20170919181809_pageviews_default_to_zero.rb +9 -0
  114. data/db/migrate/20171201191059_add_domains_to_cas_site.rb +6 -0
  115. data/lib/cas.rb +22 -0
  116. data/lib/cas/config.rb +42 -0
  117. data/lib/cas/engine.rb +33 -0
  118. data/lib/cas/form_field.rb +54 -0
  119. data/lib/cas/remote_callbacks.rb +36 -0
  120. data/lib/cas/section_config.rb +84 -0
  121. data/lib/cas/setup.rb +43 -0
  122. data/lib/cas/version.rb +3 -0
  123. data/lib/devise/custom_failure.rb +16 -0
  124. data/lib/tasks/cas_tasks.rake +4 -0
  125. data/lib/templates/erb/scaffold/_form.html.erb +13 -0
  126. metadata +560 -0
@@ -0,0 +1,10 @@
1
+ module Cas
2
+ class Section < ApplicationRecord
3
+ extend ::FriendlyId
4
+ friendly_id :name, use: :slugged
5
+
6
+ belongs_to :site
7
+ has_many :contents, dependent: :destroy
8
+ has_many :categories, dependent: :destroy
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ module Cas
2
+ class Site < ApplicationRecord
3
+ has_many :sections, dependent: :destroy
4
+ end
5
+ end
@@ -0,0 +1,39 @@
1
+ module Cas
2
+ class User < ApplicationRecord
3
+ ROLES = %w[admin editor writer].freeze
4
+
5
+ before_save { self.email = email.to_s.downcase }
6
+ validates :name, presence: true, length: { maximum: 50 }
7
+ validates :email, presence: true, length: { maximum: 255 },
8
+ uniqueness: { case_sensitive: false }
9
+ validates :password, presence: true, length: { minimum: 6 }, on: :create, allow_blank: true
10
+
11
+ devise :database_authenticatable, #:recoverable,
12
+ :rememberable, :trackable, :validatable
13
+
14
+ has_many :contents
15
+ has_many :files, class_name: Cas::MediaFile, as: :attachable
16
+
17
+ def self.find_for_database_authentication(warden_conditions)
18
+ conditions = warden_conditions.dup
19
+ sql = where(["lower(login) = :value OR lower(email) = :value", {
20
+ value: conditions[:email].downcase
21
+ }])
22
+ sql.first
23
+ end
24
+
25
+ def admin?
26
+ roles.include?("admin")
27
+ end
28
+
29
+ def editor?
30
+ roles.include?("editor")
31
+ end
32
+
33
+ private
34
+
35
+ def email_required?
36
+ false
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,26 @@
1
+ class ::FileUploader < Shrine
2
+ plugin :versions
3
+ plugin :processing
4
+
5
+ process(:store) do |io, context|
6
+ result = {}
7
+ if context[:record].media_type == 'image'
8
+ result = Cas::RemoteCallbacks.callbacks[:uploaded_image_versions].call(io, context)
9
+ end
10
+ original = (io.respond_to?(:[]) && io[:original]) ? io[:original] : io
11
+ result = result.merge(original: original) unless result.keys.include?(:original)
12
+ result
13
+ end
14
+
15
+ def generate_location(io, context)
16
+ Rails.logger.info "FileUploader#generate_location"
17
+ year = Time.now.strftime("%Y")
18
+ month = Time.now.strftime("%m")
19
+ original_filename = context[:metadata]["filename"]
20
+
21
+ # the default unique identifier
22
+ name = "#{SecureRandom.hex[0..6]}-#{original_filename}"
23
+
24
+ [year, month, name].compact.join("/")
25
+ end
26
+ end
@@ -0,0 +1,24 @@
1
+ <h2>Log in</h2>
2
+
3
+ <%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
4
+ <div class="field">
5
+ <%= f.label :email, "Login ou email" %><br />
6
+ <%= f.text_field :email, autofocus: true %>
7
+ </div>
8
+
9
+ <div class="field">
10
+ <%= f.label :password %><br />
11
+ <%= f.password_field :password, autocomplete: "off" %>
12
+ </div>
13
+
14
+ <% if devise_mapping.rememberable? -%>
15
+ <div class="field">
16
+ <%= f.check_box :remember_me %><br />
17
+ <%= f.label :remember_me %>
18
+ </div>
19
+ <% end -%>
20
+
21
+ <div class="actions">
22
+ <%= f.submit "Entrar", id: 'login' %>
23
+ </div>
24
+ <% end %>
@@ -0,0 +1,19 @@
1
+ <%= simple_form_for([@section, category]) do |f| %>
2
+ <% if category.errors.any? %>
3
+ <div id="error_explanation">
4
+ <h2>Ocorreram alguns erros:</h2>
5
+
6
+ <ul>
7
+ <% category.errors.full_messages.each do |message| %>
8
+ <li><%= message %></li>
9
+ <% end %>
10
+ </ul>
11
+ </div>
12
+ <% end %>
13
+
14
+ <%= f.input :name %>
15
+
16
+ <div class="actions">
17
+ <%= f.submit "Salvar", id: 'submit' %>
18
+ </div>
19
+ <% end %>
@@ -0,0 +1,5 @@
1
+ <h1>Editando categoria: <%= @category.name %></h1>
2
+
3
+ <%= render 'form', category: @category %>
4
+
5
+ <%= link_to 'Voltar', section_categories_path(@section) %>
@@ -0,0 +1,28 @@
1
+ <p id="notice"><%= notice %></p>
2
+
3
+ <h1>Categorias: <%= @section.name %></h1>
4
+
5
+ <table>
6
+ <thead>
7
+ <tr>
8
+ <th>Categoria</th>
9
+ </tr>
10
+ </thead>
11
+
12
+ <tbody>
13
+ <% @categories.each do |category| %>
14
+ <tr>
15
+ <td>
16
+ <%= link_to category.name,
17
+ cas.edit_section_category_path(@section, category),
18
+ id: "edit-category-#{category.id}"
19
+ %>
20
+ </td>
21
+ </tr>
22
+ <% end %>
23
+ </tbody>
24
+ </table>
25
+
26
+ <br>
27
+
28
+ <%= link_to 'Nova categoria', cas.new_section_category_path(@section), id: 'new-category' %>
@@ -0,0 +1,5 @@
1
+ <h1><%= @section.name %>: nova categoria</h1>
2
+
3
+ <%= render 'form', category: @category %>
4
+
5
+ <%= link_to 'Voltar', section_categories_path(@section) %>
@@ -0,0 +1,42 @@
1
+ <% content_for(:upload, true) %>
2
+
3
+ <div class="cas-attachments dropzone" data-attachable-type="contents" data-attachable-id="<%= @content.id %>">
4
+ <div class="dropzone-description">
5
+ <div class="container">
6
+ Solte seus arquivos para fazer upload.
7
+ </div>
8
+ </div>
9
+ <div class="container">
10
+ <div class="upload-input">
11
+ <%= f.input :file,
12
+ as: :file,
13
+ type: :string,
14
+ label: "Anexos",
15
+ input_html: {
16
+ multiple: "multiple",
17
+ images: "#js-item-images",
18
+ } %>
19
+ </div>
20
+
21
+ <script id="cas-attachments-template" type="text/x-custom-template">
22
+ <%= render "form_attachments_template",
23
+ file_id: '',
24
+ file_name: '' %>
25
+ </script>
26
+
27
+ <div id="attachments-list">
28
+ <% @content.attachments.order("cas_media_files.order asc").each do |file| %>
29
+ <%= render "form_attachments_template",
30
+ file_id: file.id,
31
+ file_name: file.original_name %>
32
+ <% end %>
33
+ </div>
34
+ </div>
35
+ </div>
36
+
37
+ <% if Rails.env.test? %>
38
+ <%= hidden_field_tag "images[files][0][id]", "", id: "test_file_1" %>
39
+ <%= hidden_field_tag "images[files][1][id]", "", id: "test_file_2" %>
40
+ <%= hidden_field_tag "images[files][2][id]", "", id: "test_file_3" %>
41
+ <%= hidden_field_tag "images[cover_id]", "", id: "test_file_cover_id" %>
42
+ <% end %>
@@ -0,0 +1,11 @@
1
+ <div class="attachment-item" data-id="<%= file_id %>">
2
+ <div class="attachment-container">
3
+ <div class="filename">
4
+ <%= file_name %>
5
+ </div>
6
+
7
+ <div class="attachment-options">
8
+ <a href="javascript: void(0)" class="js-delete-file btn">Excluir</a>
9
+ </div>
10
+ </div>
11
+ </div>
@@ -0,0 +1,85 @@
1
+ <%= simple_form_for ([@section, @content]) do |f| %>
2
+ <% if display_field?(:category) %>
3
+ <p>
4
+ <%= f.input :category_id,
5
+ label: "Categoria:",
6
+ collection: @categories.map { |c| [c.name, c.id] },
7
+ input_html: { class: 'js-select2' }
8
+ %>
9
+ </p>
10
+ <% end %>
11
+
12
+ <% if display_field?(:title) %>
13
+ <p>
14
+ <%= f.input :title, required: true, as: :string, label: 'Título:' %>
15
+ </p>
16
+ <% end %>
17
+
18
+ <% if display_field?(:summary) %>
19
+ <p>
20
+ <%= f.input :summary, as: :text, label: 'Resumo' %>
21
+ </p>
22
+ <% end %>
23
+
24
+ <% if display_field?(:location) %>
25
+ <p>
26
+ <%= f.input :location, as: :string, label: 'Local:' %>
27
+ </p>
28
+ <% end %>
29
+
30
+ <% if display_field?(:date) %>
31
+ <% field = field_properties(:date) %>
32
+ <p>
33
+ <%= f.input :date,
34
+ as: (field.format.map(&:to_s).include?("hour") ? :datetime : :date),
35
+ label: 'Data:',
36
+ order: field.format,
37
+ default: @default_date
38
+ %>
39
+ </p>
40
+ <% end %>
41
+
42
+ <% if display_field?(:tags) %>
43
+ <% autocomplete = ActsAsTaggableOn::Tag.all.map { |t| {value: t.name, text: t.name} } %>
44
+ <%= f.input :tag_list,
45
+ as: :string,
46
+ required: false,
47
+ label: "Tags",
48
+ input_html: {
49
+ value: f.object.tag_list.join(", "),
50
+ class: "js-tags",
51
+ data: { autocomplete: autocomplete.to_json }
52
+ }
53
+ %>
54
+ <% end %>
55
+
56
+ <% if display_field?(:url) %>
57
+ <p>
58
+ <%= f.input :url, label: 'URL:' %>
59
+ </p>
60
+ <% end %>
61
+
62
+ <% if display_field?(:text) %>
63
+ <p>
64
+ <%= f.input :text, as: :text, label: 'Texto', input_html: { class: 'editor' } %>
65
+ </p>
66
+ <% end %>
67
+
68
+ <% if display_field?(:embedded) %>
69
+ <p>
70
+ <%= f.input :embedded, label: 'URL:' %>
71
+ </p>
72
+ <% end %>
73
+
74
+ <% if display_field?(:attachments) %>
75
+ <%= render 'form_attachments', f: f %>
76
+ <% end %>
77
+
78
+ <% if display_field?(:images) %>
79
+ <%= render 'form_images', f: f %>
80
+ <% end %>
81
+
82
+ <div class="actions">
83
+ <%= f.submit "Salvar", id: 'submit' %>
84
+ </div>
85
+ <% end %>
@@ -0,0 +1,36 @@
1
+ <%= simple_form_for ([@section, @content]) do |f| %>
2
+ <p>
3
+ <%= f.input :title, as: :string, label: 'Título:' %>
4
+ </p>
5
+
6
+ <% questions = @content.metadata.dig("survey", "questions") %>
7
+ <%= simple_fields_for "content[metadata]" do |o| %>
8
+ <% 4.times do |t| %>
9
+ <%= o.input "survey][questions][#{t}][text",
10
+ label: "Pergunta #{t+1}",
11
+ required: (t == 0 ? true : false),
12
+ input_html: {
13
+ id: "question_#{t+1}_text",
14
+ value: questions&.dig("#{t}", "text")
15
+ } %>
16
+
17
+ <%= o.input "survey][questions][#{t}][votes",
18
+ as: :hidden,
19
+ input_html: {
20
+ id: "question_#{t+1}_votes",
21
+ value: questions&.dig("#{t}", "votes") || 0
22
+ } %>
23
+ <% end %>
24
+ <% end %>
25
+
26
+ <p>
27
+ <%= f.input :published,
28
+ as: :boolean,
29
+ label: 'Publicado?',
30
+ input_html: { checked: true } %>
31
+ </p>
32
+
33
+ <div class="actions">
34
+ <%= f.submit "Salvar", id: 'submit' %>
35
+ </div>
36
+ <% end %>
@@ -0,0 +1,86 @@
1
+ <% content_for(:upload, true) %>
2
+
3
+ <div class="cas-image-gallery dropzone" data-attachable-type="contents" data-attachable-id="<%= @content.id %>">
4
+ <div class="dropzone-description">
5
+ <div class="container">
6
+ Solte seus arquivos para fazer upload.
7
+ </div>
8
+ </div>
9
+ <div class="container">
10
+ <div class="upload-input">
11
+ <%= f.input :file,
12
+ as: :file,
13
+ type: :string,
14
+ label: "Imagens",
15
+ input_html: {
16
+ accept: "image/png, image/jpg",
17
+ multiple: "multiple",
18
+ images: "#js-item-images"
19
+ } %>
20
+ </div>
21
+
22
+ <script id="cas-gallery-image-template" type="text/x-custom-template">
23
+ <div class="image-container" data-id="" data-is-cover="" data-filename="">
24
+ <div class="image-margin">
25
+ <div class="unselected-but-selectable">
26
+ <div class="check"></div>
27
+ </div>
28
+ <div class="selection">
29
+ <div class="overlay"></div>
30
+ <div class="check"></div>
31
+ </div>
32
+ <div class="cover-indication">
33
+ <div class="cover-symbol"></div>
34
+ </div>
35
+ <div class="image js-image"
36
+ style="background-image: url('')">
37
+
38
+ <div class="image-options">
39
+ <div class="overlay"></div>
40
+ <div class="buttons">
41
+ <a href="javascript: void(0)" class="js-mark-as-cover btn">Definir capa</a>
42
+ <a href="javascript: void(0)" class="js-delete-image btn">Excluir</a>
43
+ </div>
44
+ </div>
45
+
46
+ </div>
47
+ </div>
48
+ </div>
49
+ </script>
50
+
51
+ <div class="edit-buttons">
52
+ <div class="when-selection-disabled">
53
+ <a href="javascript: void(0);" class="js-toggle-selection btn">Selecionar</a>
54
+ </div>
55
+
56
+ <div class="when-selection-enabled">
57
+ Selecionados:
58
+ <a href="javascript: void(0);" class="js-delete-image btn">Excluir</a>
59
+ <a href="javascript: void(0);" class="js-toggle-selection btn">Cancelar</a>
60
+ </div>
61
+ </div>
62
+
63
+ <% @content.images.order("cas_media_files.order asc").each do |file| %>
64
+ <img class="cas-gallery-preloaded"
65
+ data-src="<%= file.url(version: :original) %>"
66
+ data-id="<%= file.id %>"
67
+ data-filename="<%= file.original_name %>"
68
+ data-original-order="<%= file.order %>"
69
+ data-is-cover="<%= file.cover.to_s %>">
70
+ <% end %>
71
+
72
+ <div class="images">
73
+ </div>
74
+ </div>
75
+ </div>
76
+
77
+ <% if Rails.env.test? %>
78
+ <%= hidden_field_tag "images[files][0][id]", "", id: "test_image_1" %>
79
+ <%= hidden_field_tag "images[files][1][id]", "", id: "test_image_2" %>
80
+ <%= hidden_field_tag "images[files][2][id]", "", id: "test_image_3" %>
81
+ <%= hidden_field_tag "images[cover_id]", "", id: "test_image_cover_id" %>
82
+
83
+ <%= hidden_field_tag "attachments[files][0][id]", "", id: "test_attachment_1" %>
84
+ <%= hidden_field_tag "attachments[files][1][id]", "", id: "test_attachment_2" %>
85
+ <%= hidden_field_tag "attachments[files][2][id]", "", id: "test_attachment_3" %>
86
+ <% end %>
@@ -0,0 +1,6 @@
1
+ <p><%= @section.name %></p>
2
+ <h1>Editar: <%= @content.title %></h1>
3
+
4
+ <%= render "form_for_#{@content_type}" %>
5
+
6
+ <%= link_to 'Voltar', section_contents_path %>