Use PassportMap
This commit is contained in:
parent
5939e3ec87
commit
907ecff5dd
14 changed files with 65 additions and 134 deletions
|
@ -16,6 +16,7 @@ class PassportsController < ApplicationController
|
||||||
# GET /passports/new
|
# GET /passports/new
|
||||||
def new
|
def new
|
||||||
@passport = Passport.new
|
@passport = Passport.new
|
||||||
|
@passport.build_passport_map
|
||||||
|
|
||||||
authorize @passport
|
authorize @passport
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,32 +3,17 @@
|
||||||
class Passport < ApplicationRecord
|
class Passport < ApplicationRecord
|
||||||
REQUIRED_CONFIRMATIONS = 3
|
REQUIRED_CONFIRMATIONS = 3
|
||||||
|
|
||||||
enum sex: %i[male female]
|
|
||||||
|
|
||||||
has_many_attached :images
|
has_many_attached :images
|
||||||
|
|
||||||
has_one :passport_map, dependent: :restrict_with_exception
|
has_one :passport_map, dependent: :restrict_with_exception
|
||||||
|
|
||||||
has_many :passport_confirmations, dependent: :restrict_with_exception
|
has_many :passport_confirmations, dependent: :restrict_with_exception
|
||||||
|
|
||||||
|
accepts_nested_attributes_for :passport_map
|
||||||
|
|
||||||
validates :confirmed,
|
validates :confirmed,
|
||||||
inclusion: { in: [false], unless: :enough_confirmations? }
|
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
|
def image
|
||||||
images.order(created_at: :desc).last
|
images.order(created_at: :desc).last
|
||||||
end
|
end
|
||||||
|
|
|
@ -10,11 +10,12 @@ class PassportPolicy < ApplicationPolicy
|
||||||
end
|
end
|
||||||
|
|
||||||
def permitted_attributes_for_create
|
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: [],
|
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
|
end
|
||||||
|
|
||||||
|
|
|
@ -1,22 +1,25 @@
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<%= simple_form_for @passport do |f| %>
|
<%= simple_form_for @passport do |f| %>
|
||||||
<%= f.input :surname %>
|
<%= f.simple_fields_for :passport_map do |ff| %>
|
||||||
<%= f.input :given_name %>
|
<%= ff.input :surname %>
|
||||||
<%= f.input :patronymic %>
|
<%= ff.input :given_name %>
|
||||||
<%= f.input :sex,
|
<%= ff.input :patronymic %>
|
||||||
as: :radio_buttons,
|
<%= ff.input :sex,
|
||||||
collection: Passport.sexes.keys.map { |sex|
|
as: :radio_buttons,
|
||||||
[Passport.human_attribute_name("sex.#{sex}"), sex]
|
collection: PassportMap.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 %>
|
<%= ff.input :date_of_birth, start_year: Date.today.year - 150,
|
||||||
<%= f.input :place_of_birth %>
|
end_year: Date.today.year %>
|
||||||
<%= f.input :series %>
|
<%= ff.input :place_of_birth %>
|
||||||
<%= f.input :number %>
|
<%= ff.input :series %>
|
||||||
<%= f.input :issued_by %>
|
<%= ff.input :number %>
|
||||||
<%= f.input :unit_code %>
|
<%= ff.input :issued_by %>
|
||||||
<%= f.input :date_of_issue, start_year: Date.today.year - 150,
|
<%= ff.input :unit_code %>
|
||||||
end_year: Date.today.year %>
|
<%= ff.input :date_of_issue, start_year: Date.today.year - 150,
|
||||||
|
end_year: Date.today.year %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<%= f.input :images %>
|
<%= f.input :images %>
|
||||||
|
|
||||||
<%= f.button :submit %>
|
<%= f.button :submit %>
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<h1>
|
<h1>
|
||||||
<%= @passport.surname %>
|
<%= @passport.passport_map.surname %>
|
||||||
<%= @passport.given_name %>
|
<%= @passport.passport_map.given_name %>
|
||||||
<%= @passport.patronymic %>
|
<%= @passport.passport_map.patronymic %>
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<hr/>
|
<hr/>
|
||||||
|
@ -62,77 +62,77 @@
|
||||||
<%= Passport.human_attribute_name :surname %>
|
<%= Passport.human_attribute_name :surname %>
|
||||||
</dt>
|
</dt>
|
||||||
<dd class="col-lg-8">
|
<dd class="col-lg-8">
|
||||||
<%= @passport.surname %>
|
<%= @passport.passport_map.surname %>
|
||||||
</dd>
|
</dd>
|
||||||
|
|
||||||
<dt class="col-lg-4">
|
<dt class="col-lg-4">
|
||||||
<%= Passport.human_attribute_name :given_name %>
|
<%= Passport.human_attribute_name :given_name %>
|
||||||
</dt>
|
</dt>
|
||||||
<dd class="col-lg-8">
|
<dd class="col-lg-8">
|
||||||
<%= @passport.given_name %>
|
<%= @passport.passport_map.given_name %>
|
||||||
</dd>
|
</dd>
|
||||||
|
|
||||||
<dt class="col-lg-4">
|
<dt class="col-lg-4">
|
||||||
<%= Passport.human_attribute_name :patronymic %>
|
<%= Passport.human_attribute_name :patronymic %>
|
||||||
</dt>
|
</dt>
|
||||||
<dd class="col-lg-8">
|
<dd class="col-lg-8">
|
||||||
<%= @passport.patronymic %>
|
<%= @passport.passport_map.patronymic %>
|
||||||
</dd>
|
</dd>
|
||||||
|
|
||||||
<dt class="col-lg-4">
|
<dt class="col-lg-4">
|
||||||
<%= Passport.human_attribute_name :sex %>
|
<%= Passport.human_attribute_name :sex %>
|
||||||
</dt>
|
</dt>
|
||||||
<dd class="col-lg-8">
|
<dd class="col-lg-8">
|
||||||
<%= Passport.human_attribute_name "sex.#{@passport.sex}" %>
|
<%= Passport.human_attribute_name "sex.#{@passport.passport_map.sex}" %>
|
||||||
</dd>
|
</dd>
|
||||||
|
|
||||||
<dt class="col-lg-4">
|
<dt class="col-lg-4">
|
||||||
<%= Passport.human_attribute_name :date_of_birth %>
|
<%= Passport.human_attribute_name :date_of_birth %>
|
||||||
</dt>
|
</dt>
|
||||||
<dd class="col-lg-8">
|
<dd class="col-lg-8">
|
||||||
<%= localize @passport.date_of_birth %>
|
<%= localize @passport.passport_map.date_of_birth %>
|
||||||
</dd>
|
</dd>
|
||||||
|
|
||||||
<dt class="col-lg-4">
|
<dt class="col-lg-4">
|
||||||
<%= Passport.human_attribute_name :place_of_birth %>
|
<%= Passport.human_attribute_name :place_of_birth %>
|
||||||
</dt>
|
</dt>
|
||||||
<dd class="col-lg-8">
|
<dd class="col-lg-8">
|
||||||
<%= @passport.place_of_birth %>
|
<%= @passport.passport_map.place_of_birth %>
|
||||||
</dd>
|
</dd>
|
||||||
|
|
||||||
<dt class="col-lg-4">
|
<dt class="col-lg-4">
|
||||||
<%= Passport.human_attribute_name :series %>
|
<%= Passport.human_attribute_name :series %>
|
||||||
</dt>
|
</dt>
|
||||||
<dd class="col-lg-8">
|
<dd class="col-lg-8">
|
||||||
<%= passport_series @passport.series %>
|
<%= passport_series @passport.passport_map.series %>
|
||||||
</dd>
|
</dd>
|
||||||
|
|
||||||
<dt class="col-lg-4">
|
<dt class="col-lg-4">
|
||||||
<%= Passport.human_attribute_name :number %>
|
<%= Passport.human_attribute_name :number %>
|
||||||
</dt>
|
</dt>
|
||||||
<dd class="col-lg-8">
|
<dd class="col-lg-8">
|
||||||
<%= passport_number @passport.number %>
|
<%= passport_number @passport.passport_map.number %>
|
||||||
</dd>
|
</dd>
|
||||||
|
|
||||||
<dt class="col-lg-4">
|
<dt class="col-lg-4">
|
||||||
<%= Passport.human_attribute_name :issued_by %>
|
<%= Passport.human_attribute_name :issued_by %>
|
||||||
</dt>
|
</dt>
|
||||||
<dd class="col-lg-8">
|
<dd class="col-lg-8">
|
||||||
<%= @passport.issued_by %>
|
<%= @passport.passport_map.issued_by %>
|
||||||
</dd>
|
</dd>
|
||||||
|
|
||||||
<dt class="col-lg-4">
|
<dt class="col-lg-4">
|
||||||
<%= Passport.human_attribute_name :unit_code %>
|
<%= Passport.human_attribute_name :unit_code %>
|
||||||
</dt>
|
</dt>
|
||||||
<dd class="col-lg-8">
|
<dd class="col-lg-8">
|
||||||
<%= @passport.unit_code %>
|
<%= @passport.passport_map.unit_code %>
|
||||||
</dd>
|
</dd>
|
||||||
|
|
||||||
<dt class="col-lg-4">
|
<dt class="col-lg-4">
|
||||||
<%= Passport.human_attribute_name :date_of_issue %>
|
<%= Passport.human_attribute_name :date_of_issue %>
|
||||||
</dt>
|
</dt>
|
||||||
<dd class="col-lg-8">
|
<dd class="col-lg-8">
|
||||||
<%= localize @passport.date_of_issue %>
|
<%= localize @passport.passport_map.date_of_issue %>
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -35,17 +35,6 @@ en:
|
||||||
confirmed: Confirmed?
|
confirmed: Confirmed?
|
||||||
passport_confirmations_count: Confirmations count
|
passport_confirmations_count: Confirmations count
|
||||||
images: Images
|
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:
|
passport_map:
|
||||||
id: ID
|
id: ID
|
||||||
surname: Surname
|
surname: Surname
|
||||||
|
|
|
@ -35,17 +35,6 @@ ru:
|
||||||
confirmed: Подтверждён?
|
confirmed: Подтверждён?
|
||||||
passport_confirmations_count: Количество подтверждений
|
passport_confirmations_count: Количество подтверждений
|
||||||
images: Изображения
|
images: Изображения
|
||||||
surname: Фамилия
|
|
||||||
given_name: Имя
|
|
||||||
patronymic: Отчество
|
|
||||||
sex: Пол
|
|
||||||
date_of_birth: Дата рождения
|
|
||||||
place_of_birth: Место рождения
|
|
||||||
series: Серия
|
|
||||||
number: Номер
|
|
||||||
issued_by: Кем выдан
|
|
||||||
unit_code: Код подразделения
|
|
||||||
date_of_issue: Дата выдачи
|
|
||||||
passport_map:
|
passport_map:
|
||||||
id: ID
|
id: ID
|
||||||
surname: Фамилия
|
surname: Фамилия
|
||||||
|
|
17
db/migrate/20181202142918_remove_mapping_from_passports.rb
Normal file
17
db/migrate/20181202142918_remove_mapping_from_passports.rb
Normal 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
|
13
db/schema.rb
13
db/schema.rb
|
@ -10,7 +10,7 @@
|
||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# 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
|
# These are extensions that must be enabled in order to support this database
|
||||||
enable_extension "plpgsql"
|
enable_extension "plpgsql"
|
||||||
|
@ -108,17 +108,6 @@ ActiveRecord::Schema.define(version: 2018_12_02_140310) do
|
||||||
create_table "passports", force: :cascade do |t|
|
create_table "passports", force: :cascade do |t|
|
||||||
t.datetime "created_at", null: false
|
t.datetime "created_at", null: false
|
||||||
t.datetime "updated_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
|
t.boolean "confirmed", default: false, null: false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ FactoryBot.define do
|
||||||
surname { Faker::Name.last_name }
|
surname { Faker::Name.last_name }
|
||||||
given_name { Faker::Name.first_name }
|
given_name { Faker::Name.first_name }
|
||||||
patronymic { 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 }
|
date_of_birth { Faker::Date.backward }
|
||||||
place_of_birth { Faker::Address.city }
|
place_of_birth { Faker::Address.city }
|
||||||
series { rand 0..9999 }
|
series { rand 0..9999 }
|
||||||
|
|
|
@ -1,21 +1,7 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
FactoryBot.define do
|
FactoryBot.define do
|
||||||
factory :empty_passport, class: Passport do
|
factory :empty_passport, class: Passport
|
||||||
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 :passport_without_image, parent: :empty_passport do
|
factory :passport_without_image, parent: :empty_passport do
|
||||||
confirmed { false }
|
confirmed { false }
|
||||||
|
|
|
@ -25,7 +25,7 @@ RSpec.describe PassportMap do
|
||||||
|
|
||||||
describe '#patronymic' do
|
describe '#patronymic' do
|
||||||
context 'when it is empty' do
|
context 'when it is empty' do
|
||||||
subject { create :passport_without_image, patronymic: '' }
|
subject { create :passport_map, patronymic: '' }
|
||||||
|
|
||||||
specify do
|
specify do
|
||||||
expect(subject.patronymic).to eq nil
|
expect(subject.patronymic).to eq nil
|
||||||
|
@ -33,7 +33,7 @@ RSpec.describe PassportMap do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when it is blank' do
|
context 'when it is blank' do
|
||||||
subject { create :passport_without_image, patronymic: ' ' }
|
subject { create :passport_map, patronymic: ' ' }
|
||||||
|
|
||||||
specify do
|
specify do
|
||||||
expect(subject.patronymic).to eq nil
|
expect(subject.patronymic).to eq nil
|
||||||
|
|
|
@ -17,18 +17,6 @@ RSpec.describe Passport do
|
||||||
.dependent(:restrict_with_exception)
|
.dependent(:restrict_with_exception)
|
||||||
end
|
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 '#image'
|
||||||
pending '#enough_confirmations?'
|
pending '#enough_confirmations?'
|
||||||
|
|
||||||
|
@ -72,22 +60,4 @@ RSpec.describe Passport do
|
||||||
it { is_expected.to allow_value true }
|
it { is_expected.to allow_value true }
|
||||||
end
|
end
|
||||||
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
|
end
|
||||||
|
|
|
@ -4,6 +4,7 @@ require 'rails_helper'
|
||||||
|
|
||||||
RSpec.describe 'GET /passports/:id' do
|
RSpec.describe 'GET /passports/:id' do
|
||||||
before do
|
before do
|
||||||
|
create :passport_map, passport: passport
|
||||||
get "/passports/#{passport.id}"
|
get "/passports/#{passport.id}"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Reference in a new issue