diff --git a/Gemfile.lock b/Gemfile.lock
index 72989ad..d5f5e1b 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -131,6 +131,8 @@ GEM
nio4r (2.5.8)
nokogiri (1.13.8-arm64-darwin)
racc (~> 1.4)
+ nokogiri (1.13.8-x86_64-linux)
+ racc (~> 1.4)
orm_adapter (0.5.0)
popper_js (2.11.6)
public_suffix (5.0.0)
@@ -206,6 +208,7 @@ GEM
activesupport (>= 5.2)
sprockets (>= 3.0.0)
sqlite3 (1.5.2-arm64-darwin)
+ sqlite3 (1.5.2-x86_64-linux)
thor (1.2.1)
tilt (2.0.11)
timeout (0.3.0)
@@ -222,6 +225,7 @@ GEM
PLATFORMS
arm64-darwin-21
+ x86_64-linux
DEPENDENCIES
bootstrap (~> 5.2.1)
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 1f6be59..b21f628 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -1,4 +1,9 @@
class ApplicationController < ActionController::Base
-
-
+ def authenticate_user!
+ if user_signed_in?
+ super
+ else
+ redirect_to new_user_session_path, :notice => 'Realize login para continuar ou crie uma nova conta'
+ end
+ end
end
diff --git a/app/controllers/product_categories_controller.rb b/app/controllers/product_categories_controller.rb
index 180bc41..b2467d6 100644
--- a/app/controllers/product_categories_controller.rb
+++ b/app/controllers/product_categories_controller.rb
@@ -1,9 +1,10 @@
class ProductCategoriesController < ApplicationController
def create
- ProductCategory.create!(name: params.require(:product_category).permit(:name))
+ ProductCategory.create!(params.require(:product_category).permit(:name))
redirect_to products_path, notice: 'Categoria cadastrada'
end
+
def search
nome_a_buscar = params[:busca]
ProductCategory.where("name LIKE :param_busca OR outro_campo LIKE :param_busca OR mais_um_campo LIKE :param_busca ",
diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb
index 039a826..f7aeb63 100644
--- a/app/controllers/products_controller.rb
+++ b/app/controllers/products_controller.rb
@@ -1,12 +1,11 @@
class ProductsController < ApplicationController
before_action :set_product, only: %i[ show edit update destroy ]
+ before_action :product_params, only:[:create, :update]
+ before_action :authenticate_user!
# GET /products
def index
@products = Product.all
- @product = Product.new
- @product_category = ProductCategory.new
- @product_categories = ProductCategory.all
end
# GET /products/1
@@ -25,11 +24,11 @@ def edit
# POST /products
def create
@product = Product.new(product_params)
-
+
if @product.save
- redirect_to @product, notice: "Product was successfully created."
+ redirect_to @product, notice: "Produto cadastrado com sucesso"
else
- render :new, status: :unprocessable_entity
+ render :new
end
end
@@ -50,12 +49,14 @@ def destroy
private
# Use callbacks to share common setup or constraints between actions.
- def set_product
- @product = Product.find(params[:id])
- end
+ def set_product
+ @product = Product.find(params[:id])
+ end
+
+ # Only allow a list of trusted parameters through.
+ def product_params
+ params.require(:product).permit(:name, :price, :product_category_id)
+ end
- # Only allow a list of trusted parameters through.
- def product_params
- params.require(:product).permit(:name, :price, :product_category_id)
- end
end
+
diff --git a/app/controllers/welcome_controller.rb b/app/controllers/welcome_controller.rb
index 73ff2dc..f1ecfc5 100644
--- a/app/controllers/welcome_controller.rb
+++ b/app/controllers/welcome_controller.rb
@@ -1,9 +1,6 @@
class WelcomeController < ApplicationController
-
def index
-
end
-
end
\ No newline at end of file
diff --git a/app/models/product.rb b/app/models/product.rb
index a6e4544..1b0ccfe 100644
--- a/app/models/product.rb
+++ b/app/models/product.rb
@@ -1,5 +1,6 @@
class Product < ApplicationRecord
- belongs_to :product_category, optional: true
+ belongs_to :product_category
+ validates :name, :price, :product_category, presence: true
end
diff --git a/app/models/product_category.rb b/app/models/product_category.rb
index 282738c..305de3c 100644
--- a/app/models/product_category.rb
+++ b/app/models/product_category.rb
@@ -1,3 +1,4 @@
class ProductCategory < ApplicationRecord
+ has_many :products
validates :name, presence: true
end
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb
index c557d62..720718d 100644
--- a/app/views/layouts/application.html.erb
+++ b/app/views/layouts/application.html.erb
@@ -11,42 +11,9 @@
-
<%= notice %>
diff --git a/app/views/products/_error.html.erb b/app/views/products/_error.html.erb
new file mode 100644
index 0000000..1a9e830
--- /dev/null
+++ b/app/views/products/_error.html.erb
@@ -0,0 +1,9 @@
+<% if @product.errors.any? %>
+
+
+ <% @product.errors.each do |error| %>
+ - <%= error.full_message %>
+ <% end %>
+
+
+ <% end %>
\ No newline at end of file
diff --git a/app/views/products/_form.html.erb b/app/views/products/_form.html.erb
deleted file mode 100644
index a2a1d8e..0000000
--- a/app/views/products/_form.html.erb
+++ /dev/null
@@ -1,27 +0,0 @@
-<%= form_with(model: product) do |form| %>
- <% if product.errors.any? %>
-
-
<%= pluralize(product.errors.count, "error") %> prohibited this product from being saved:
-
-
- <% product.errors.each do |error| %>
- - <%= error.full_message %>
- <% end %>
-
-
- <% end %>
-
-
- <%= form.label :name, style: "display: block" %>
- <%= form.text_field :name %>
-
-
-
- <%= form.label :price, style: "display: block" %>
- <%= form.text_field :price %>
-
-
-
- <%= form.submit %>
-
-<% end %>
diff --git a/app/views/products/_product.html.erb b/app/views/products/_product.html.erb
deleted file mode 100644
index 19ca353..0000000
--- a/app/views/products/_product.html.erb
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
- Name:
- <%= product.name %>
-
-
-
- Price:
- <%= product.price %>
-
-
-
diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb
index a84a004..e3c20b6 100644
--- a/app/views/products/index.html.erb
+++ b/app/views/products/index.html.erb
@@ -1,11 +1,10 @@
<%= notice %>
-
Products
+
Produtos
<% @products.each do |product| %>
- <%= render product %>
- <%= link_to "Show this product", product %>
+ <%= link_to "Ver produto", product %>
<% end %>
@@ -18,33 +17,7 @@
<% end %>
+<%= link_to 'Cadastrar produto', new_product_path %>
+<%= link_to 'Voltar', root_path %>
-
Novo Produto
-<%= form_with(model: @product) do |form| %>
-
- <%= form.label :name, style: "display: block" %>
- <%= form.text_field :name %>
-
-
-
- <%= form.label :price, style: "display: block" %>
- <%= form.text_field :price %>
-
-
-
- <%= form.label :condition_new, 'Produto Novo' %>
- <%= form.radio_button :condition, :new %>
-
- <%= form.label :condition_used, 'Produto Usado' %>
- <%= form.radio_button :condition, :used %>
-
-
-
- <%= form.submit %>
-
-<% end %>
-
-
-choose 'Produto Usado'
-
diff --git a/app/views/products/new.html.erb b/app/views/products/new.html.erb
index d438e41..ab47752 100644
--- a/app/views/products/new.html.erb
+++ b/app/views/products/new.html.erb
@@ -1,9 +1,31 @@
-
New product
+<%= render 'error' %>
-<%= render "form", product: @product %>
+
Novo Produto
+
+<%= form_with(model: @product) do |form| %>
+
+ <%= form.label :name, style: "display: block" %>
+ <%= form.text_field :name %>
+
+
+
+ <%= form.label :price, style: "display: block" %>
+ <%= form.text_field :price %>
+
+
+
+ <%= form.label :product_category_id, style: "display: block" %>
+ <%= form.collection_select :product_category_id, ProductCategory.all, :id, :name, include_blank:true %>
+
+
+
+ <%= form.submit 'Salvar' %>
+
+
+<% end %>
- <%= link_to "Back to products", products_path %>
+ <%= link_to "Voltar", products_path %>
diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb
index 7e30dc8..31bb58b 100644
--- a/app/views/products/show.html.erb
+++ b/app/views/products/show.html.erb
@@ -1,12 +1,17 @@
<%= notice %>
-<%= render @product %>
+
<%= @product.name %>
-<%= render @product.product_category %>
+
+ - <%= Product.human_attribute_name(:name) %>:
+ - <%= @product.name %>
+ - <%= Product.human_attribute_name(:price) %>:
-
+
- <%= number_to_currency(@product.price, :unit => "R$ ", :separator => ",", :delimiter => ".") %>
+ - <%= Product.human_attribute_name(:product_category) %>:
-
+
- <%= @product.product_category.name %>
+
- <%= link_to "Edit this product", edit_product_path(@product) %> |
- <%= link_to "Back to products", products_path %>
-
- <%= button_to "Destroy this product", @product, method: :delete %>
+ <%= link_to "Editar produto", edit_product_path(@product) %> |
+ <%= link_to "Voltar", products_path %>
diff --git a/app/views/welcome/index.html.erb b/app/views/welcome/index.html.erb
index 65777a5..7e404b8 100644
--- a/app/views/welcome/index.html.erb
+++ b/app/views/welcome/index.html.erb
@@ -1,4 +1,4 @@
-<%= translate('.title') %>
+Sistema de Frete e Transportadoras
@@ -40,3 +40,7 @@
<%= link_to 'Início', root_path, class: 'btn btn-primary btn-lg' %>
+<%= link_to 'Produtos', products_path, class: 'btn btn-primary btn-lg' %>
+<%= link_to 'Sair', destroy_user_session_path, :method => :delete, class: 'btn btn-primary btn-lg' %>
+
+
diff --git a/config/application.rb b/config/application.rb
index cfa4ef9..a7653f0 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -33,5 +33,9 @@ class Application < Rails::Application
# Don't generate system test files.
config.generators.system_tests = nil
+
+ config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]
+ config.i18n.locale = :'pt-BR'
+ config.i18n.default_locale = :'pt-BR'
end
end
diff --git a/config/environments/development.rb b/config/environments/development.rb
index 5ab2549..53c1867 100644
--- a/config/environments/development.rb
+++ b/config/environments/development.rb
@@ -17,6 +17,8 @@
# Enable server timing
config.server_timing = true
+ #config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
+
# Enable/disable caching. By default caching is disabled.
# Run rails dev:cache to toggle caching.
if Rails.root.join("tmp/caching-dev.txt").exist?
diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb
index 5ea5514..3de640c 100644
--- a/config/initializers/devise.rb
+++ b/config/initializers/devise.rb
@@ -24,7 +24,7 @@
# Configure the e-mail address which will be shown in Devise::Mailer,
# note that it will be overwritten if you use your own mailer class
# with default "from" parameter.
- config.mailer_sender = 'please-change-me-at-config-initializers-devise@example.com'
+ # config.mailer_sender = 'please-change-me-at-config-initializers-devise@example.com'
# Configure the class responsible to send e-mails.
# config.mailer = 'Devise::Mailer'
diff --git a/config/initializers/locale.rb b/config/initializers/locale.rb
new file mode 100644
index 0000000..53fbc79
--- /dev/null
+++ b/config/initializers/locale.rb
@@ -0,0 +1,2 @@
+I18n.available_locales = ['pt-BR']
+I18n.default_locale = :'pt-BR'
diff --git a/config/locales/devise.pt-BR.yml b/config/locales/devise.pt-BR.yml
new file mode 100644
index 0000000..e5e18d0
--- /dev/null
+++ b/config/locales/devise.pt-BR.yml
@@ -0,0 +1,148 @@
+pt-BR:
+ activerecord:
+ attributes:
+ user:
+ confirmation_sent_at: Confirmação enviada em
+ confirmation_token: Token de confirmação
+ confirmed_at: Confirmado em
+ created_at: Criado em
+ current_password: Senha atual
+ current_sign_in_at: Atualmente logado em
+ current_sign_in_ip: IP do acesso atual
+ email: E-mail
+ name: Nome
+ encrypted_password: Senha criptografada
+ failed_attempts: Tentativas sem sucesso
+ last_sign_in_at: Último acesso em
+ last_sign_in_ip: Último IP de acesso
+ locked_at: Bloqueado em
+ password: Senha
+ password_confirmation: Confirme sua senha
+ remember_created_at: Lembrar criado em
+ remember_me: Lembre-se de mim
+ reset_password_sent_at: Resetar senha enviado em
+ reset_password_token: Resetar token de senha
+ sign_in_count: Contagem de acessos
+ unconfirmed_email: E-mail não confirmado
+ unlock_token: Token de desbloqueio
+ updated_at: Atualizado em
+ models:
+ user:
+ one: Usuário
+ other: Usuários
+ devise:
+ confirmations:
+ confirmed: A sua conta foi confirmada com sucesso.
+ new:
+ resend_confirmation_instructions: Reenviar instruções de confirmação
+ send_instructions: Dentro de minutos, você receberá um email com as instruções de confirmação da sua conta.
+ send_paranoid_instructions: Se o seu e-mail existir em nosso banco de dados, você receberá um email com instruções sobre como confirmar sua conta em alguns minutos.
+ failure:
+ already_authenticated: Você já está autenticado.
+ inactive: A sua conta ainda não foi ativada.
+ invalid: "%{authentication_keys} ou senha inválidos."
+ last_attempt: Você tem mais uma única tentativa antes de sua conta ser bloqueada.
+ locked: A sua conta está bloqueada.
+ not_found_in_database: "%{authentication_keys} ou senha inválidos."
+ timeout: A sua sessão expirou, por favor, faça login novamente para continuar.
+ unauthenticated: Para continuar, faça login ou registre-se.
+ unconfirmed: Antes de continuar, confirme a sua conta.
+ mailer:
+ confirmation_instructions:
+ action: Confirmar minha conta
+ greeting: Bem-vindo %{recipient}!
+ instruction: 'Você pode confirmar sua conta através do link abaixo:'
+ subject: Instruções de confirmação
+ email_changed:
+ greeting: Olá %{recipient}!
+ message: Estamos entrando em contato para notificá-lo de que seu e-mail está sendo alterado para %{email}.
+ message_unconfirmed: Estamos entrando em contato para notificá-lo de que seu e-mail está sendo alterado para %{email}.
+ subject: E-mail alterado
+ password_change:
+ greeting: Olá %{recipient}!
+ message: Estamos entrando em contato para notificá-lo de que sua senha foi alterada.
+ subject: Senha alterada
+ reset_password_instructions:
+ action: Redefinir minha senha
+ greeting: Olá %{recipient}!
+ instruction: Alguém fez o pedido para redefinir sua senha, e você pode fazer isso clicando no link abaixo.
+ instruction_2: Se você não fez este pedido, por favor ignore este e-mail.
+ instruction_3: Sua senha não será alterada até que você acesse o link acima e crie uma nova.
+ subject: Instruções de redefinição de senha
+ unlock_instructions:
+ action: Desbloquear minha conta
+ greeting: Olá %{recipient}!
+ instruction: 'Clique no link abaixo para desbloquear sua conta:'
+ message: Sua conta foi bloqueada devido ao excessivo número de tentativas acesso inválidas.
+ subject: Instruções de desbloqueio
+ omniauth_callbacks:
+ failure: Não foi possível autorizar de uma conta de %{kind} porque "%{reason}".
+ success: Autorizado com sucesso de uma conta de %{kind}.
+ passwords:
+ edit:
+ change_my_password: Alterar minha senha
+ change_your_password: Alterar sua senha
+ confirm_new_password: Confirme sua nova senha
+ new_password: Nova senha
+ new:
+ forgot_your_password: Esqueceu sua senha?
+ send_me_reset_password_instructions: Enviar instruções para redefinição da senha
+ no_token: Você não pode acessar esta página sem estar logado. Se você veio de um email de redefinição de senha, por favor certifique-se de ter digitado a URL corretamente.
+ send_instructions: Dentro de minutos, você receberá um e-mail com as instruções de redefinição da sua senha.
+ send_paranoid_instructions: Se o seu email existir em nosso banco de dados, você receberá um email com um link para recuperação da senha.
+ updated: A sua senha foi alterada com sucesso. Você está autenticado.
+ updated_not_active: Sua senha foi alterada com sucesso.
+ registrations:
+ destroyed: Adeus! A sua conta foi cancelada com sucesso. Esperamos vê-lo novamente em breve.
+ edit:
+ are_you_sure: Você tem certeza?
+ cancel_my_account: Cancelar minha conta
+ currently_waiting_confirmation_for_email: 'No momento esperando por: %{email}'
+ leave_blank_if_you_don_t_want_to_change_it: deixe em branco caso não queira alterá-la
+ title: Editar %{resource}
+ unhappy: Não está contente?
+ update: Atualizar
+ we_need_your_current_password_to_confirm_your_changes: precisamos da sua senha atual para confirmar suas mudanças
+ new:
+ sign_up: Criar uma conta
+ signed_up: Boas-vindas! Você realizou seu registro com sucesso.
+ signed_up_but_inactive: Você se inscreveu com sucesso, porém nós não podemos autenticá-lo porque sua conta ainda não foi ativada.
+ signed_up_but_locked: Você se inscreveu com sucesso. Porém nós não podemos autenticá-lo porque sua conta está bloqueada.
+ signed_up_but_unconfirmed: Uma mensagem com um link de confirmação foi enviada para o seu e-mail. Por favor, acesse o link para ativar sua conta.
+ update_needs_confirmation: Sua conta foi atualizada com sucesso, mas nós precisamos verificar o novo endereço de email. Por favor, verifique seu e-mail e clique no link de confirmação para finalizar confirmando o seu novo e-mail.
+ updated: A sua conta foi atualizada com sucesso.
+ updated_but_not_signed_in: Sua conta foi atualizada com sucesso, uma vez que sua senha foi alterada será necessário realizar o login novamente.
+ sessions:
+ already_signed_out: Logout efetuado com sucesso.
+ new:
+ sign_in: Login
+ signed_in: Login efetuado com sucesso.
+ signed_out: Logout efetuado com sucesso.
+ shared:
+ links:
+ back: Voltar
+ didn_t_receive_confirmation_instructions: Não recebeu instruções de confirmação?
+ didn_t_receive_unlock_instructions: Não recebeu instruções de desbloqueio?
+ forgot_your_password: Esqueceu sua senha?
+ sign_in: Login
+ sign_in_with_provider: Entrar com %{provider}
+ sign_up: Inscrever-se
+ minimum_password_length:
+ one: "(Mínimo de %{count} caractere)"
+ other: "(Mínimo de %{count} caracteres)"
+ unlocks:
+ new:
+ resend_unlock_instructions: Reenviar instruções de desbloqueio
+ send_instructions: Dentro de minutos, você receberá um e-mail com instruções de desbloqueio da sua conta.
+ send_paranoid_instructions: Se sua conta existir em nosso banco de dados, você receberá em breve um e-mail com instruções para desbloquear ela.
+ unlocked: A sua conta foi desbloqueada com sucesso. Efetue login para continuar.
+ errors:
+ messages:
+ already_confirmed: já foi confirmado
+ confirmation_period_expired: É necessário ser confirmado dentro do período %{period}, por favor requisite um novo usuário.
+ expired: expirou, por favor solicite uma nova
+ not_found: não encontrado
+ not_locked: não foi bloqueado
+ not_saved:
+ one: 'Não foi possível salvar %{resource}: 1 erro'
+ other: 'Não foi possível salvar %{resource}: %{count} erros.'
\ No newline at end of file
diff --git a/config/locales/modelo_produto.yml b/config/locales/modelo_produto.yml
new file mode 100644
index 0000000..405f627
--- /dev/null
+++ b/config/locales/modelo_produto.yml
@@ -0,0 +1,6 @@
+pt-BR:
+ helpers:
+ label:
+ product_category:
+ product_category: Modelo de produto
+ product_category_id: Modelo de produto
\ No newline at end of file
diff --git a/config/locales/product.pt-BR.yml b/config/locales/product.pt-BR.yml
new file mode 100644
index 0000000..6909ea4
--- /dev/null
+++ b/config/locales/product.pt-BR.yml
@@ -0,0 +1,11 @@
+pt-BR:
+ activerecord:
+ models:
+ product: 'Produto'
+ product_category: 'Modelo de produto'
+ attributes:
+ product:
+ name: 'Nome'
+ price: 'Preço'
+ product_category: 'Modelo de produto'
+ product_category_id: 'Modelo de produto'
diff --git a/config/locales/product_categories.pt-BR.yml b/config/locales/product_categories.pt-BR.yml
new file mode 100644
index 0000000..956b7ee
--- /dev/null
+++ b/config/locales/product_categories.pt-BR.yml
@@ -0,0 +1,8 @@
+pt-BR:
+ activerecord:
+ models:
+ product_categories: 'Produto'
+ attributes:
+ product_categories:
+ name: 'Nome'
+
\ No newline at end of file
diff --git a/config/locales/produto.pt-BR.yml b/config/locales/produto.pt-BR.yml
new file mode 100644
index 0000000..5e77ffa
--- /dev/null
+++ b/config/locales/produto.pt-BR.yml
@@ -0,0 +1,4 @@
+produto:
+ Name: 'Nome'
+ Price: 'Prazo'
+ product_category: 'Modelo de produto'
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
deleted file mode 100644
index 68c10cf..0000000
--- a/config/locales/pt-BR.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-en:
- transport_mode:
- error:
- not_available: 'Não existe modalidade disponível'
-
- welcome:
- index:
- title: 'Sistema de Frete e Transporatdoras'
- outro:
- outro:
- outro:
-
-
-I18n.translate('transport_mode.error.not_available')
\ No newline at end of file
diff --git a/config/locales/pt-BR2.yml b/config/locales/pt-BR2.yml
new file mode 100644
index 0000000..8f9d0df
--- /dev/null
+++ b/config/locales/pt-BR2.yml
@@ -0,0 +1,223 @@
+---
+pt-BR:
+ activerecord:
+ errors:
+ messages:
+ record_invalid: 'A validação falhou: %{errors}'
+ restrict_dependent_destroy:
+ has_one: Não é possível excluir o registro pois existe um %{record} dependente
+ has_many: Não é possível excluir o registro pois existem %{record} dependentes
+ date:
+ abbr_day_names:
+ - dom
+ - seg
+ - ter
+ - qua
+ - qui
+ - sex
+ - sáb
+ abbr_month_names:
+ -
+ - jan
+ - fev
+ - mar
+ - abr
+ - mai
+ - jun
+ - jul
+ - ago
+ - set
+ - out
+ - nov
+ - dez
+ day_names:
+ - domingo
+ - segunda-feira
+ - terça-feira
+ - quarta-feira
+ - quinta-feira
+ - sexta-feira
+ - sábado
+ formats:
+ default: "%d/%m/%Y"
+ long: "%d de %B de %Y"
+ short: "%d de %B"
+ month_names:
+ -
+ - janeiro
+ - fevereiro
+ - março
+ - abril
+ - maio
+ - junho
+ - julho
+ - agosto
+ - setembro
+ - outubro
+ - novembro
+ - dezembro
+ order:
+ - :day
+ - :month
+ - :year
+ datetime:
+ distance_in_words:
+ about_x_hours:
+ one: aproximadamente 1 hora
+ other: aproximadamente %{count} horas
+ about_x_months:
+ one: aproximadamente 1 mês
+ other: aproximadamente %{count} meses
+ about_x_years:
+ one: aproximadamente 1 ano
+ other: aproximadamente %{count} anos
+ almost_x_years:
+ one: quase 1 ano
+ other: quase %{count} anos
+ half_a_minute: meio minuto
+ less_than_x_seconds:
+ one: menos de 1 segundo
+ other: menos de %{count} segundos
+ less_than_x_minutes:
+ one: menos de um minuto
+ other: menos de %{count} minutos
+ over_x_years:
+ one: mais de 1 ano
+ other: mais de %{count} anos
+ x_seconds:
+ one: 1 segundo
+ other: "%{count} segundos"
+ x_minutes:
+ one: 1 minuto
+ other: "%{count} minutos"
+ x_days:
+ one: 1 dia
+ other: "%{count} dias"
+ x_months:
+ one: 1 mês
+ other: "%{count} meses"
+ x_years:
+ one: 1 ano
+ other: "%{count} anos"
+ prompts:
+ second: Segundo
+ minute: Minuto
+ hour: Hora
+ day: Dia
+ month: Mês
+ year: Ano
+ errors:
+ format: "%{attribute} %{message}"
+ messages:
+ accepted: deve ser aceito
+ blank: não pode ficar em branco
+ confirmation: não é igual a %{attribute}
+ empty: não pode ficar vazio
+ equal_to: deve ser igual a %{count}
+ even: deve ser par
+ exclusion: não está disponível
+ greater_than: deve ser maior que %{count}
+ greater_than_or_equal_to: deve ser maior ou igual a %{count}
+ inclusion: não está incluído na lista
+ invalid: não é válido
+ less_than: deve ser menor que %{count}
+ less_than_or_equal_to: deve ser menor ou igual a %{count}
+ model_invalid: 'A validação falhou: %{errors}'
+ not_a_number: não é um número
+ not_an_integer: não é um número inteiro
+ odd: deve ser ímpar
+ other_than: deve ser diferente de %{count}
+ present: deve ficar em branco
+ required: é obrigatório(a)
+ taken: já está em uso
+ too_long:
+ one: 'é muito longo (máximo: 1 caracter)'
+ other: 'é muito longo (máximo: %{count} caracteres)'
+ too_short:
+ one: 'é muito curto (mínimo: 1 caracter)'
+ other: 'é muito curto (mínimo: %{count} caracteres)'
+ wrong_length:
+ one: não possui o tamanho esperado (1 caracter)
+ other: não possui o tamanho esperado (%{count} caracteres)
+ template:
+ body: 'Por favor, verifique o(s) seguinte(s) campo(s):'
+ header:
+ one: 'Não foi possível gravar %{model}: 1 erro'
+ other: 'Não foi possível gravar %{model}: %{count} erros'
+ helpers:
+ select:
+ prompt: Por favor selecione
+ submit:
+ create: Criar %{model}
+ submit: Salvar %{model}
+ update: Atualizar %{model}
+ number:
+ currency:
+ format:
+ delimiter: "."
+ format: "%u %n"
+ precision: 2
+ separator: ","
+ significant: false
+ strip_insignificant_zeros: false
+ unit: R$
+ format:
+ delimiter: "."
+ precision: 3
+ separator: ","
+ significant: false
+ strip_insignificant_zeros: false
+ human:
+ decimal_units:
+ format: "%n %u"
+ units:
+ billion:
+ one: bilhão
+ other: bilhões
+ million:
+ one: milhão
+ other: milhões
+ quadrillion:
+ one: quatrilhão
+ other: quatrilhões
+ thousand: mil
+ trillion:
+ one: trilhão
+ other: trilhões
+ unit: ''
+ format:
+ delimiter: ''
+ precision: 3
+ significant: true
+ strip_insignificant_zeros: true
+ storage_units:
+ format: "%n %u"
+ units:
+ byte:
+ one: Byte
+ other: Bytes
+ eb: EB
+ gb: GB
+ kb: KB
+ mb: MB
+ pb: PB
+ tb: TB
+ percentage:
+ format:
+ delimiter: "."
+ format: "%n%"
+ precision:
+ format:
+ delimiter: "."
+ support:
+ array:
+ last_word_connector: " e "
+ two_words_connector: " e "
+ words_connector: ", "
+ time:
+ am: ''
+ formats:
+ default: "%a, %d de %B de %Y, %H:%M:%S %z"
+ long: "%d de %B de %Y, %H:%M"
+ short: "%d de %B, %H:%M"
+ pm: ''
\ No newline at end of file
diff --git a/config/routes.rb b/config/routes.rb
index e23c4d5..5a476c6 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,8 +1,12 @@
Rails.application.routes.draw do
resources :products
- resources :product_categories, only: [:create, :show] do
- resources :products, only: [:create]
+ resources :product_categories, only: [:new, :create, :show] do
+ resources :products, only: [:create, :new, :show]
end
devise_for :users
root 'welcome#index'
+ devise_scope :user do
+ get '/users/sign_out' => 'devise/sessions#destroy'
+ get "/home", :to => "devise/sessions#new", :as => :home
+ end
end
diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb
index 1a859fa..c3b55ed 100644
--- a/spec/rails_helper.rb
+++ b/spec/rails_helper.rb
@@ -6,6 +6,9 @@
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'rspec/rails'
# Add additional requires below this line. Rails is not loaded until this point!
+require 'capybara/rails'
+
+require 'devise'
# Requires supporting ruby files with custom matchers and macros, etc, in
# spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are
@@ -24,6 +27,7 @@
# Checks for pending migrations and applies them before tests are run.
# If you are not using ActiveRecord, you can remove these lines.
+
begin
ActiveRecord::Migration.maintain_test_schema!
rescue ActiveRecord::PendingMigrationError => e
@@ -33,6 +37,10 @@
config.before(:each, type: :system) do
driven_by :rack_test
end
+
+ config.include Warden::Test::Helpers
+
+
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
config.fixture_path = "#{::Rails.root}/spec/fixtures"
diff --git a/spec/system/product/user_register_product_spec.rb b/spec/system/product/user_register_product_spec.rb
new file mode 100644
index 0000000..7a62179
--- /dev/null
+++ b/spec/system/product/user_register_product_spec.rb
@@ -0,0 +1,77 @@
+require 'rails_helper'
+
+describe 'Usuário cadastra produto' do
+ it 'com sucesso' do
+ user = User.create!(email:'joao@campuscode.com', password:'12345678')
+ ProductCategory.create!(name:'Eletrônicos')
+
+ login_as(user)
+ visit root_path
+ click_on 'Produtos'
+ click_on 'Cadastrar produto'
+ fill_in 'Nome', with: 'XBox'
+ fill_in 'Preço', with: '1000'
+ select 'Eletrônicos', from: 'Modelo de produto'
+ click_on 'Salvar'
+
+ expect(page).to have_content("Produto cadastrado com sucesso")
+ expect(page).to have_content("Nome: XBox")
+ expect(page).to have_content("Preço: R$ 1.000,00")
+ expect(page).to have_content("Modelo de produto: Eletrônicos")
+ expect(page).to have_link("Voltar")
+ end
+
+ it 'e mantém campos obrigatórios' do
+ user = User.create!(email:'joao@campuscode.com', password:'12345678')
+ ProductCategory.create!(name:'Eletrodométicos')
+
+ login_as(user)
+ visit root_path
+ click_on 'Produtos'
+ click_on 'Cadastrar produto'
+ fill_in 'Nome', with: ''
+ fill_in 'Preço', with: ''
+ click_on 'Salvar'
+
+ expect(page).to have_content("Nome não pode ficar em branco")
+ expect(page).to have_content("Preço não pode ficar em branco")
+ expect(page).to have_content("Modelo de produto não pode ficar em branco")
+ expect(page).to have_content("Modelo de produto é obrigatório")
+ expect(page).to have_link("Voltar")
+ end
+
+ it 'e volta para a tela inicial' do
+ user = User.create!(email:'joao@campuscode.com', password:'12345678')
+ ProductCategory.create!(name:'Artigos para o lar')
+
+ login_as(user)
+ visit root_path
+ click_on 'Produtos'
+ click_on 'Cadastrar produto'
+ click_on 'Voltar'
+ click_on 'Voltar'
+
+ expect(page).not_to have_link("Voltar")
+ expect(page).to have_content("Sistema de Frete e Transportadoras")
+ expect(page).to have_link("Início")
+ expect(page).to have_link("Produtos")
+ expect(page).to have_link("Sair")
+ expect(current_path).to eq root_path
+ end
+
+ it 'e não está autenticado' do
+ user = User.create!(email:'joao@campuscode.com', password:'12345678')
+ ProductCategory.create!(name:'Artigos para o lar')
+
+ visit root_path
+ click_on 'Produtos'
+
+ expect(page).not_to have_link("Voltar")
+ expect(page).not_to have_content("Sistema de Frete e Transportadoras")
+ expect(page).not_to have_link("Sair")
+ expect(page).to have_text("Realize login para continuar ou crie uma nova conta")
+ expect(page).to have_field("E-mail")
+ expect(page).to have_field("Senha")
+ expect(page).to have_button("Log in")
+ end
+end
\ No newline at end of file