1
0
Fork 0

Use PassportMap

This commit is contained in:
Alex Kotov 2018-12-02 19:41:48 +05:00
parent 5939e3ec87
commit 907ecff5dd
No known key found for this signature in database
GPG Key ID: 4E831250F47DE154
14 changed files with 65 additions and 134 deletions

View File

@ -16,6 +16,7 @@ class PassportsController < ApplicationController
# GET /passports/new
def new
@passport = Passport.new
@passport.build_passport_map
authorize @passport
end

View File

@ -3,32 +3,17 @@
class Passport < ApplicationRecord
REQUIRED_CONFIRMATIONS = 3
enum sex: %i[male female]
has_many_attached :images
has_one :passport_map, dependent: :restrict_with_exception
has_many :passport_confirmations, dependent: :restrict_with_exception
accepts_nested_attributes_for :passport_map
validates :confirmed,
inclusion: { in: [false], unless: :enough_confirmations? }
validates :surname, presence: true
validates :given_name, presence: true
validates :sex, presence: true
validates :date_of_birth, presence: true
validates :place_of_birth, presence: true
validates :series, presence: true
validates :number, presence: true
validates :issued_by, presence: true
validates :unit_code, presence: true
validates :date_of_issue, presence: true
before_validation do
self.patronymic = nil if patronymic.blank?
end
def image
images.order(created_at: :desc).last
end

View File

@ -10,11 +10,12 @@ class PassportPolicy < ApplicationPolicy
end
def permitted_attributes_for_create
%i[
surname given_name patronymic sex date_of_birth place_of_birth series
number issued_by unit_code date_of_issue
] + [
[
images: [],
passport_map_attributes: %i[
surname given_name patronymic sex date_of_birth place_of_birth series
number issued_by unit_code date_of_issue
],
]
end

View File

@ -1,22 +1,25 @@
<div class="container">
<%= simple_form_for @passport do |f| %>
<%= f.input :surname %>
<%= f.input :given_name %>
<%= f.input :patronymic %>
<%= f.input :sex,
as: :radio_buttons,
collection: Passport.sexes.keys.map { |sex|
[Passport.human_attribute_name("sex.#{sex}"), sex]
} %>
<%= f.input :date_of_birth, start_year: Date.today.year - 150,
end_year: Date.today.year %>
<%= f.input :place_of_birth %>
<%= f.input :series %>
<%= f.input :number %>
<%= f.input :issued_by %>
<%= f.input :unit_code %>
<%= f.input :date_of_issue, start_year: Date.today.year - 150,
end_year: Date.today.year %>
<%= f.simple_fields_for :passport_map do |ff| %>
<%= ff.input :surname %>
<%= ff.input :given_name %>
<%= ff.input :patronymic %>
<%= ff.input :sex,
as: :radio_buttons,
collection: PassportMap.sexes.keys.map { |sex|
[Passport.human_attribute_name("sex.#{sex}"), sex]
} %>
<%= ff.input :date_of_birth, start_year: Date.today.year - 150,
end_year: Date.today.year %>
<%= ff.input :place_of_birth %>
<%= ff.input :series %>
<%= ff.input :number %>
<%= ff.input :issued_by %>
<%= ff.input :unit_code %>
<%= ff.input :date_of_issue, start_year: Date.today.year - 150,
end_year: Date.today.year %>
<% end %>
<%= f.input :images %>
<%= f.button :submit %>

View File

@ -1,8 +1,8 @@
<div class="container-fluid">
<h1>
<%= @passport.surname %>
<%= @passport.given_name %>
<%= @passport.patronymic %>
<%= @passport.passport_map.surname %>
<%= @passport.passport_map.given_name %>
<%= @passport.passport_map.patronymic %>
</h1>
<hr/>
@ -62,77 +62,77 @@
<%= Passport.human_attribute_name :surname %>
</dt>
<dd class="col-lg-8">
<%= @passport.surname %>
<%= @passport.passport_map.surname %>
</dd>
<dt class="col-lg-4">
<%= Passport.human_attribute_name :given_name %>
</dt>
<dd class="col-lg-8">
<%= @passport.given_name %>
<%= @passport.passport_map.given_name %>
</dd>
<dt class="col-lg-4">
<%= Passport.human_attribute_name :patronymic %>
</dt>
<dd class="col-lg-8">
<%= @passport.patronymic %>
<%= @passport.passport_map.patronymic %>
</dd>
<dt class="col-lg-4">
<%= Passport.human_attribute_name :sex %>
</dt>
<dd class="col-lg-8">
<%= Passport.human_attribute_name "sex.#{@passport.sex}" %>
<%= Passport.human_attribute_name "sex.#{@passport.passport_map.sex}" %>
</dd>
<dt class="col-lg-4">
<%= Passport.human_attribute_name :date_of_birth %>
</dt>
<dd class="col-lg-8">
<%= localize @passport.date_of_birth %>
<%= localize @passport.passport_map.date_of_birth %>
</dd>
<dt class="col-lg-4">
<%= Passport.human_attribute_name :place_of_birth %>
</dt>
<dd class="col-lg-8">
<%= @passport.place_of_birth %>
<%= @passport.passport_map.place_of_birth %>
</dd>
<dt class="col-lg-4">
<%= Passport.human_attribute_name :series %>
</dt>
<dd class="col-lg-8">
<%= passport_series @passport.series %>
<%= passport_series @passport.passport_map.series %>
</dd>
<dt class="col-lg-4">
<%= Passport.human_attribute_name :number %>
</dt>
<dd class="col-lg-8">
<%= passport_number @passport.number %>
<%= passport_number @passport.passport_map.number %>
</dd>
<dt class="col-lg-4">
<%= Passport.human_attribute_name :issued_by %>
</dt>
<dd class="col-lg-8">
<%= @passport.issued_by %>
<%= @passport.passport_map.issued_by %>
</dd>
<dt class="col-lg-4">
<%= Passport.human_attribute_name :unit_code %>
</dt>
<dd class="col-lg-8">
<%= @passport.unit_code %>
<%= @passport.passport_map.unit_code %>
</dd>
<dt class="col-lg-4">
<%= Passport.human_attribute_name :date_of_issue %>
</dt>
<dd class="col-lg-8">
<%= localize @passport.date_of_issue %>
<%= localize @passport.passport_map.date_of_issue %>
</dd>
</dl>
</div>

View File

@ -35,17 +35,6 @@ en:
confirmed: Confirmed?
passport_confirmations_count: Confirmations count
images: Images
surname: Surname
given_name: Given names
patronymic: Patronymic
sex: Sex
date_of_birth: Date of birth
place_of_birth: Place of birth
series: Series
number: Number
issued_by: Issued by
unit_code: Unit code
date_of_issue: Date of issue
passport_map:
id: ID
surname: Surname

View File

@ -35,17 +35,6 @@ ru:
confirmed: Подтверждён?
passport_confirmations_count: Количество подтверждений
images: Изображения
surname: Фамилия
given_name: Имя
patronymic: Отчество
sex: Пол
date_of_birth: Дата рождения
place_of_birth: Место рождения
series: Серия
number: Номер
issued_by: Кем выдан
unit_code: Код подразделения
date_of_issue: Дата выдачи
passport_map:
id: ID
surname: Фамилия

View File

@ -0,0 +1,17 @@
# frozen_string_literal: true
class RemoveMappingFromPassports < ActiveRecord::Migration[5.2]
def change
remove_column :passports, :surname, :string, null: false
remove_column :passports, :given_name, :string, null: false
remove_column :passports, :patronymic, :string
remove_column :passports, :sex, :integer, null: false
remove_column :passports, :date_of_birth, :date, null: false
remove_column :passports, :place_of_birth, :string, null: false
remove_column :passports, :series, :integer, null: false
remove_column :passports, :number, :integer, null: false
remove_column :passports, :issued_by, :text, null: false
remove_column :passports, :unit_code, :string, null: false
remove_column :passports, :date_of_issue, :date, null: false
end
end

View File

@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 2018_12_02_140310) do
ActiveRecord::Schema.define(version: 2018_12_02_142918) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@ -108,17 +108,6 @@ ActiveRecord::Schema.define(version: 2018_12_02_140310) do
create_table "passports", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "surname", null: false
t.string "given_name", null: false
t.string "patronymic"
t.integer "sex", null: false
t.date "date_of_birth", null: false
t.string "place_of_birth", null: false
t.integer "series", null: false
t.integer "number", null: false
t.string "unit_code", null: false
t.date "date_of_issue", null: false
t.text "issued_by", null: false
t.boolean "confirmed", default: false, null: false
end

View File

@ -7,7 +7,7 @@ FactoryBot.define do
surname { Faker::Name.last_name }
given_name { Faker::Name.first_name }
patronymic { Faker::Name.first_name }
sex { Passport.sexes.keys.sample }
sex { PassportMap.sexes.keys.sample }
date_of_birth { Faker::Date.backward }
place_of_birth { Faker::Address.city }
series { rand 0..9999 }

View File

@ -1,21 +1,7 @@
# frozen_string_literal: true
FactoryBot.define do
factory :empty_passport, class: Passport do
surname { Faker::Name.last_name }
given_name { Faker::Name.first_name }
patronymic { Faker::Name.first_name }
sex { Passport.sexes.keys.sample }
date_of_birth { Faker::Date.backward }
place_of_birth { Faker::Address.city }
series { rand 0..9999 }
number { rand 0..999_999 }
issued_by { Faker::Lorem.sentence }
unit_code do
"#{rand(0..999).to_s.rjust(3, '0')}-#{rand(0..999).to_s.rjust(3, '0')}"
end
date_of_issue { Faker::Date.backward }
end
factory :empty_passport, class: Passport
factory :passport_without_image, parent: :empty_passport do
confirmed { false }

View File

@ -25,7 +25,7 @@ RSpec.describe PassportMap do
describe '#patronymic' do
context 'when it is empty' do
subject { create :passport_without_image, patronymic: '' }
subject { create :passport_map, patronymic: '' }
specify do
expect(subject.patronymic).to eq nil
@ -33,7 +33,7 @@ RSpec.describe PassportMap do
end
context 'when it is blank' do
subject { create :passport_without_image, patronymic: ' ' }
subject { create :passport_map, patronymic: ' ' }
specify do
expect(subject.patronymic).to eq nil

View File

@ -17,18 +17,6 @@ RSpec.describe Passport do
.dependent(:restrict_with_exception)
end
it { is_expected.to validate_presence_of :surname }
it { is_expected.to validate_presence_of :given_name }
it { is_expected.not_to validate_presence_of :patronymic }
it { is_expected.to validate_presence_of :sex }
it { is_expected.to validate_presence_of :date_of_birth }
it { is_expected.to validate_presence_of :place_of_birth }
it { is_expected.to validate_presence_of :series }
it { is_expected.to validate_presence_of :number }
it { is_expected.to validate_presence_of :issued_by }
it { is_expected.to validate_presence_of :unit_code }
it { is_expected.to validate_presence_of :date_of_issue }
pending '#image'
pending '#enough_confirmations?'
@ -72,22 +60,4 @@ RSpec.describe Passport do
it { is_expected.to allow_value true }
end
end
describe '#patronymic' do
context 'when it is empty' do
subject { create :passport_without_image, patronymic: '' }
specify do
expect(subject.patronymic).to eq nil
end
end
context 'when it is blank' do
subject { create :passport_without_image, patronymic: ' ' }
specify do
expect(subject.patronymic).to eq nil
end
end
end
end

View File

@ -4,6 +4,7 @@ require 'rails_helper'
RSpec.describe 'GET /passports/:id' do
before do
create :passport_map, passport: passport
get "/passports/#{passport.id}"
end