audited_views 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +35 -0
- data/Rakefile +21 -0
- data/app/assets/config/audited_views_manifest.js +0 -0
- data/app/helpers/audited_views_helper.rb +115 -0
- data/app/models/audit.rb +4 -0
- data/app/views/application/_audit_record.html.erb +55 -0
- data/app/views/application/_audits.html.erb +7 -0
- data/app/views/application/_controls.html.erb +10 -0
- data/config/locales/en.yml +19 -0
- data/config/locales/pt-BR.yml +19 -0
- data/config/routes.rb +3 -0
- data/lib/audited_views.rb +5 -0
- data/lib/audited_views/engine.rb +4 -0
- data/lib/audited_views/version.rb +3 -0
- data/lib/tasks/audited_views_tasks.rake +4 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/config/manifest.js +4 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/javascripts/cable.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
- data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/controllers/products_controller.rb +58 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/helpers/products_helper.rb +2 -0
- data/spec/dummy/app/jobs/application_job.rb +2 -0
- data/spec/dummy/app/mailers/application_mailer.rb +4 -0
- data/spec/dummy/app/models/application_record.rb +3 -0
- data/spec/dummy/app/models/product.rb +3 -0
- data/spec/dummy/app/models/user.rb +6 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
- data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
- data/spec/dummy/app/views/products/_form.html.erb +42 -0
- data/spec/dummy/app/views/products/edit.html.erb +6 -0
- data/spec/dummy/app/views/products/index.html.erb +35 -0
- data/spec/dummy/app/views/products/new.html.erb +5 -0
- data/spec/dummy/app/views/products/show.html.erb +31 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +38 -0
- data/spec/dummy/bin/update +29 -0
- data/spec/dummy/bin/yarn +11 -0
- data/spec/dummy/config.ru +5 -0
- data/spec/dummy/config/application.rb +18 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/cable.yml +10 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +54 -0
- data/spec/dummy/config/environments/production.rb +91 -0
- data/spec/dummy/config/environments/test.rb +42 -0
- data/spec/dummy/config/initializers/application_controller_renderer.rb +6 -0
- data/spec/dummy/config/initializers/assets.rb +14 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +33 -0
- data/spec/dummy/config/puma.rb +56 -0
- data/spec/dummy/config/routes.rb +3 -0
- data/spec/dummy/config/secrets.yml +32 -0
- data/spec/dummy/config/spring.rb +6 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/20170507023018_create_products.rb +13 -0
- data/spec/dummy/db/migrate/20170507023113_create_users.rb +10 -0
- data/spec/dummy/db/migrate/20170507191539_install_audited.rb +30 -0
- data/spec/dummy/db/schema.rb +54 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +154 -0
- data/spec/dummy/log/test.log +747 -0
- data/spec/dummy/package.json +5 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
- data/spec/dummy/public/apple-touch-icon.png +0 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/spec/factories/products.rb +9 -0
- data/spec/dummy/spec/factories/users.rb +6 -0
- data/spec/dummy/spec/features/controls_spec.rb +28 -0
- data/spec/dummy/spec/helpers/audited_views_helper_spec.rb +8 -0
- data/spec/dummy/spec/models/product_spec.rb +4 -0
- data/spec/dummy/spec/models/user_spec.rb +4 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-s/-sApyz8RREntIAnO7uawATjXPT2wvPX8w1wQF1XFuSs.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3P/3PK7aqnTybA5wVtn4700SPNvcK6dejPg9tiLgBYBViI.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3Y/3YWAsbouC_92KRyVIfCR1XZUL6aU5fDhsrDPZPwqLaw.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/70/70uPUtQT3y75FopbmEz3gd0jRFdPBXxoGs6V_FqlbX0.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/9m/9m1uMOh0tNA4F013e0lQ55KsZ1mW9-DJ-P7YQ8ehjO8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Al/AlF65aLeuD-x6AxoO6n4G93XaQ5Nx0MU1FzfD4L3cPc.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/D0/D0cNdcvMptZ90AYLZ73Y5d3iFojSVkzXX1hn78q5VSU.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/G3/G3-tv19JISLSSRsGC9RGYPFoKz-eJUiLX305MLBRy2I.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/HC/HCDOUd7-S45aJ_PjVAC_Vmjyud3i1aQv4cE3t9_Z3Dw.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Hb/HbwMdgucEk--be2EHuRlKDWcL3k-dzQfMgpOy60OrTc.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/L2/L2y0YEwaUri6z1liCIMCGL4QjIm0SRdCy-uQ95Na6a8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Nl/NlsP11HhLUppMbrveWN9hUdmj5EeypXs_8VJoP7EHCQ.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/OU/OUrRymFy2GqVPmy2wEwtOU35eAGKpRc9Yd2s6FLH9IA.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/PH/PHbdEchD5mfuw2iJHZ14bwbA5umhLrM_H7vcEPsnFBU.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Q-/Q-UOgOa_LL2DWgrt0rM8RVF3jeARORAKZzpo9HQJDS4.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/VO/VOse1hbRPubC1r_WKyZVcYG1tsb06PRsqYBTWSZ_4LQ.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Vu/VuoeZYDVkOHSjfAnQhegAaddC_cmOg0_2-fEjwByr2g.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/WP/WPx0xeq-DpjAUB8Fr6PqvzYSp13C5EpZuuIVQiIfSR8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/YJ/YJtvP__n_ITqVJFjg7SNmEV8X5LbGOz153KZHMn7A9I.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/b_/b_Itlk9QZZd7Rvf8kcA4yLP1R5Acu7jB-m1xQiSU0qE.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bw/bwdvZFbg53AKcjymQ40V9gm6Lk-G_xPEv3mFu5uRSnU.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/eS/eS5Narq3MfOC-cyHoerhLMXKH4mVuSCuCUGlUBrsW-g.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/g9/g971Klk7lTPw1fRk9VTAKO2DhIDmOMMDyij3ztCQjy8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/mX/mX1nlsL_SWOB4y22W5FheRX0YEONKyOY7xUeIvRiHco.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/n_/n_xYqQYhwEMQknb3jFQnjlxxBE9TzMNHCdJ-bEyZFIw.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/nx/nxTv3sKVUQZADJyM3dPaVmUA78MIsMLD_K279yN_GsI.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pn/pneR-xUFEeqlsU0chMbmmftc6gAsfjtjN5OaIGlKhRI.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ru/ru-jaKyvWi9mo2jrTCMYECWtSm8wxxLH-UKNKEu2Uyk.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/sE/sE5I8LMVqjxu0PHdY_io7wdnYvUQnL-YQaUIk8sw-M4.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/v4/v4RHC934V-T5x1Nb2COYpgO8T9xMJDHUEL6q0crUZng.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/vV/vVAUGE3VA_1WPwDbZuHjuALjKVuSK8gJL3QGkUCz6us.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xl/xlD5Hio6dGiAlbF6RQJSD2DLDNetsbjWSo1ENNi0jdA.cache +1 -0
- data/spec/dummy/tmp/capybara/capybara-201705072202363033472193.html +139 -0
- data/spec/dummy/tmp/capybara/capybara-201705072204557673614766.html +139 -0
- data/spec/spec_helper.rb +20 -0
- metadata +374 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 47781b975820493b0c4183ebc83d5ec10d30dc63
|
4
|
+
data.tar.gz: 1a59ba2b3821cdae2a457128c9629efa4bb177e6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7c816f7826c69b8807963ef74dbf3faadb82223304e53ef11b8d111cf184677b584cfc192d2312c384c597e355fbc60570dc766a7f2bc8b62af42589011bb137
|
7
|
+
data.tar.gz: 426bf4f2d3d3f5800788669ee3f1612b1b2492cb49e44026405d197a3e8bee1a33690369a04b0d50a7e1df59982fe6b2a1d1ee76d7876b1b3a76dffb973582b3
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2017 Douglas Lise
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# AuditedViews
|
2
|
+
Views to show change logs collected by audited gem.
|
3
|
+
|
4
|
+
## Usage
|
5
|
+
Add this to your `show` views:
|
6
|
+
```
|
7
|
+
<%= audited_controls(@product) %>
|
8
|
+
```
|
9
|
+
And this to your `index` views:
|
10
|
+
```
|
11
|
+
<%= audited_controls(@products) %>
|
12
|
+
```
|
13
|
+
|
14
|
+
## Installation
|
15
|
+
Add this line to your application's Gemfile:
|
16
|
+
|
17
|
+
```ruby
|
18
|
+
gem 'audited_views'
|
19
|
+
```
|
20
|
+
|
21
|
+
And then execute:
|
22
|
+
```bash
|
23
|
+
$ bundle
|
24
|
+
```
|
25
|
+
|
26
|
+
Or install it yourself as:
|
27
|
+
```bash
|
28
|
+
$ gem install audited_views
|
29
|
+
```
|
30
|
+
|
31
|
+
## Contributing
|
32
|
+
Contribution directions go here.
|
33
|
+
|
34
|
+
## License
|
35
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
begin
|
3
|
+
require 'bundler/setup'
|
4
|
+
rescue LoadError
|
5
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
6
|
+
end
|
7
|
+
|
8
|
+
APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
|
9
|
+
load 'rails/tasks/engine.rake'
|
10
|
+
|
11
|
+
Bundler::GemHelper.install_tasks
|
12
|
+
|
13
|
+
Dir[File.join(File.dirname(__FILE__), 'tasks/**/*.rake')].each {|f| load f }
|
14
|
+
|
15
|
+
require 'rspec/core'
|
16
|
+
require 'rspec/core/rake_task'
|
17
|
+
|
18
|
+
desc "Run all specs in spec directory (excluding plugin specs)"
|
19
|
+
RSpec::Core::RakeTask.new(:spec => 'app:db:test:prepare')
|
20
|
+
|
21
|
+
task :default => :spec
|
File without changes
|
@@ -0,0 +1,115 @@
|
|
1
|
+
module AuditedViewsHelper
|
2
|
+
|
3
|
+
def audited_controls(model)
|
4
|
+
render "controls", model: model
|
5
|
+
end
|
6
|
+
|
7
|
+
#Retorna audits para o model ou para todos os models caso o parâmetro for uma relation ou array
|
8
|
+
#Retorna audits para todos os associados aos models
|
9
|
+
def audits_for(models)
|
10
|
+
models = [models] unless models.kind_of?(Array) || models.kind_of?(ActiveRecord::Relation)
|
11
|
+
audits = []
|
12
|
+
models.each do |model|
|
13
|
+
audits += model.audits#.reject {|a| a.action =~ /create/ }
|
14
|
+
audits += model.associated_audits if model.respond_to?(:associated_audits)
|
15
|
+
end
|
16
|
+
audits.sort do |a,b|
|
17
|
+
b.created_at <=> a.created_at
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def audit_link(model, text = nil)
|
22
|
+
text ||= I18n.t("audits.link_text")
|
23
|
+
unless params[:show_log]
|
24
|
+
puts "request.path: '#{request.path}'"
|
25
|
+
link_to "#{request.path}?show_log=true#audits", class: 'btn btn-default pull-right' do
|
26
|
+
text
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def audit_object_info(audit)
|
32
|
+
classe = audit.auditable_type.constantize
|
33
|
+
content_tag(:span, title: "Id #{audit.auditable_id}") do
|
34
|
+
begin
|
35
|
+
begin
|
36
|
+
classe.find(audit.auditable_id).to_s
|
37
|
+
rescue
|
38
|
+
if classe.respond_to?(:with_deleted)
|
39
|
+
classe.with_deleted.find(audit.auditable_id).to_s
|
40
|
+
else
|
41
|
+
raise
|
42
|
+
end
|
43
|
+
end
|
44
|
+
rescue ActiveRecord::RecordNotFound => e
|
45
|
+
I18n.t(:registro_excluido, scope: 'audits')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def created_by_info(model)
|
51
|
+
html = []
|
52
|
+
|
53
|
+
html << t("audits.created_at")
|
54
|
+
html << ltime(model.created_at)
|
55
|
+
if (nome = get_model_creator(model))
|
56
|
+
html << t("audits.created_by")
|
57
|
+
html << nome
|
58
|
+
end
|
59
|
+
|
60
|
+
raw html.join(" ")
|
61
|
+
end
|
62
|
+
|
63
|
+
def ldate(date)
|
64
|
+
I18n.l(date, format: :data) if date
|
65
|
+
end
|
66
|
+
|
67
|
+
def ltime(time)
|
68
|
+
I18n.l(time, format: :short) if time
|
69
|
+
end
|
70
|
+
|
71
|
+
def format_audited_value(value)
|
72
|
+
case value
|
73
|
+
when true, false
|
74
|
+
t("audited.#{value}_word")
|
75
|
+
when Date
|
76
|
+
ldate value
|
77
|
+
when NilClass
|
78
|
+
"-"
|
79
|
+
when String
|
80
|
+
sanitize(value)
|
81
|
+
else
|
82
|
+
value
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def get_model_creator(model)
|
87
|
+
model.audits.where(action: 'create').first.try(:user)
|
88
|
+
end
|
89
|
+
|
90
|
+
def created_by(model)
|
91
|
+
raw [nome_usuario(get_model_creator(model)), ltime(model.created_at)]
|
92
|
+
.compact
|
93
|
+
.delete_if(&:empty?)
|
94
|
+
.join(" - ")
|
95
|
+
end
|
96
|
+
|
97
|
+
def panel_class_for_audit_action(action)
|
98
|
+
case action
|
99
|
+
when "create" then "panel-success"
|
100
|
+
when "update" then "panel-info"
|
101
|
+
when "destroy" then "panel-danger"
|
102
|
+
else "panel-default"
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def audit_record_human_field(audit_record, field)
|
107
|
+
# The most of reference field locales are defined only with the association name (not field name)
|
108
|
+
normalized_field = field.gsub(/_id$/, "")
|
109
|
+
audit_record
|
110
|
+
.auditable_type
|
111
|
+
.constantize
|
112
|
+
.human_attribute_name(normalized_field)
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
data/app/models/audit.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
<% if audit_record.audited_changes.find{|field, (old_value,new_value)| !old_value.blank? || !new_value.blank? } %>
|
2
|
+
<div class="panel <%= panel_class_for_audit_action(audit_record.action) %>">
|
3
|
+
<div class="panel-heading">
|
4
|
+
<b><%= t(audit_record.action, scope: "audits") %></b> -
|
5
|
+
<%= ltime audit_record.created_at %> -
|
6
|
+
<%= audit_record.user %>
|
7
|
+
</div>
|
8
|
+
<div class="panel-body">
|
9
|
+
<p>
|
10
|
+
<%= audit_record.auditable_type.constantize.model_name.human %>:
|
11
|
+
<b><%= audit_object_info(audit_record) %></b>
|
12
|
+
</p>
|
13
|
+
|
14
|
+
<table class="table audits">
|
15
|
+
<tr>
|
16
|
+
<th><%= t("audits.field") %></th>
|
17
|
+
<th><%= t("audits.old_value") %></th>
|
18
|
+
<th><%= t("audits.new_value") %></th>
|
19
|
+
</tr>
|
20
|
+
<% audit_record.audited_changes.each do |field, (old_value, new_value)| %>
|
21
|
+
<%# if !old_value.blank? || !new_value.blank? %>
|
22
|
+
<tr data-audited-field="<%= field %>">
|
23
|
+
<td>
|
24
|
+
<%= audit_record_human_field(audit_record, field) %>
|
25
|
+
</td>
|
26
|
+
<% if audit_record.action == "update" && audit_record.auditable_type.constantize.column_for_attribute(field.to_sym).type == :text %>
|
27
|
+
<td colspan="2" class="diff">
|
28
|
+
<%= sanitize Differ.diff(new_value, old_value).format_as(:html) %>
|
29
|
+
</td>
|
30
|
+
<% else %>
|
31
|
+
<td>
|
32
|
+
<% if audit_record.action == "create" %>
|
33
|
+
-
|
34
|
+
<% else %>
|
35
|
+
<%= format_audited_value old_value %>
|
36
|
+
<% end %>
|
37
|
+
</td>
|
38
|
+
<td>
|
39
|
+
<% if audit_record.action == "create" %>
|
40
|
+
<!-- #Como audited changes so possui um elemento no array de campos, aqui ele aparece no primeiro elemento, logo old_value do parametro do bloco -->
|
41
|
+
<%= format_audited_value old_value %>
|
42
|
+
<% elsif audit_record.action == "destroy" %>
|
43
|
+
-
|
44
|
+
<% else %>
|
45
|
+
<%= format_audited_value new_value %>
|
46
|
+
<% end %>
|
47
|
+
</td>
|
48
|
+
<% end %>
|
49
|
+
</tr>
|
50
|
+
<%# end %>
|
51
|
+
<% end %>
|
52
|
+
</table>
|
53
|
+
</div>
|
54
|
+
</div>
|
55
|
+
<% end %>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
en:
|
2
|
+
audits:
|
3
|
+
field: Field
|
4
|
+
create: Creation
|
5
|
+
created_at: Created at
|
6
|
+
created_by: by
|
7
|
+
data_hora: Date/Time
|
8
|
+
destroy: Exclusion
|
9
|
+
link_text: Show Change Log
|
10
|
+
model: Table
|
11
|
+
new_value: New Value
|
12
|
+
old_value: Old Value
|
13
|
+
registro: Record
|
14
|
+
registro_excluido: Deleted Record
|
15
|
+
partial_title: Change Log
|
16
|
+
update: Update
|
17
|
+
usuario: User
|
18
|
+
true_word: Yes
|
19
|
+
false_word: No
|
@@ -0,0 +1,19 @@
|
|
1
|
+
pt-BR:
|
2
|
+
audits:
|
3
|
+
field: Campo
|
4
|
+
create: Criação
|
5
|
+
created_at: Registro criado em
|
6
|
+
created_by: por
|
7
|
+
data_hora: Data/Hora
|
8
|
+
destroy: Exclusão
|
9
|
+
link_text: Visualizar Log de Alterações
|
10
|
+
model: Tabela
|
11
|
+
new_value: Novo Valor
|
12
|
+
old_value: Valor Anterior
|
13
|
+
registro: Registro
|
14
|
+
registro_excluido: Registro Excluído
|
15
|
+
partial_title: Log de Alterações
|
16
|
+
update: Alteração
|
17
|
+
usuario: Usuário
|
18
|
+
true_word: Sim
|
19
|
+
false_word: Não
|
data/config/routes.rb
ADDED
data/spec/dummy/Rakefile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
2
|
+
// listed below.
|
3
|
+
//
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
5
|
+
// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
|
6
|
+
//
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
|
+
// compiled file. JavaScript code in this file should be added after the last require_* statement.
|
9
|
+
//
|
10
|
+
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
|
11
|
+
// about supported directives.
|
12
|
+
//
|
13
|
+
//= require_tree .
|
@@ -0,0 +1,13 @@
|
|
1
|
+
// Action Cable provides the framework to deal with WebSockets in Rails.
|
2
|
+
// You can generate new channels where WebSocket features live using the `rails generate channel` command.
|
3
|
+
//
|
4
|
+
//= require action_cable
|
5
|
+
//= require_self
|
6
|
+
//= require_tree ./channels
|
7
|
+
|
8
|
+
(function() {
|
9
|
+
this.App || (this.App = {});
|
10
|
+
|
11
|
+
App.cable = ActionCable.createConsumer();
|
12
|
+
|
13
|
+
}).call(this);
|
@@ -0,0 +1,15 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
9
|
+
* compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
|
10
|
+
* files in this directory. Styles in this file should be added after the last require_* statement.
|
11
|
+
* It is generally better to create a new file per style scope.
|
12
|
+
*
|
13
|
+
*= require_tree .
|
14
|
+
*= require_self
|
15
|
+
*/
|
@@ -0,0 +1,58 @@
|
|
1
|
+
class ProductsController < ApplicationController
|
2
|
+
before_action :set_product, only: [:show, :edit, :update, :destroy]
|
3
|
+
|
4
|
+
# GET /products
|
5
|
+
def index
|
6
|
+
@products = Product.all
|
7
|
+
end
|
8
|
+
|
9
|
+
# GET /products/1
|
10
|
+
def show
|
11
|
+
end
|
12
|
+
|
13
|
+
# GET /products/new
|
14
|
+
def new
|
15
|
+
@product = Product.new
|
16
|
+
end
|
17
|
+
|
18
|
+
# GET /products/1/edit
|
19
|
+
def edit
|
20
|
+
end
|
21
|
+
|
22
|
+
# POST /products
|
23
|
+
def create
|
24
|
+
@product = Product.new(product_params)
|
25
|
+
|
26
|
+
if @product.save
|
27
|
+
redirect_to @product, notice: 'Product was successfully created.'
|
28
|
+
else
|
29
|
+
render :new
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# PATCH/PUT /products/1
|
34
|
+
def update
|
35
|
+
if @product.update(product_params)
|
36
|
+
redirect_to @product, notice: 'Product was successfully updated.'
|
37
|
+
else
|
38
|
+
render :edit
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# DELETE /products/1
|
43
|
+
def destroy
|
44
|
+
@product.destroy
|
45
|
+
redirect_to products_url, notice: 'Product was successfully destroyed.'
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
# Use callbacks to share common setup or constraints between actions.
|
50
|
+
def set_product
|
51
|
+
@product = Product.find(params[:id])
|
52
|
+
end
|
53
|
+
|
54
|
+
# Only allow a trusted parameter "white list" through.
|
55
|
+
def product_params
|
56
|
+
params.require(:product).permit(:sku, :title, :price, :active, :description)
|
57
|
+
end
|
58
|
+
end
|