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
|
||||
def new
|
||||
@passport = Passport.new
|
||||
@passport.build_passport_map
|
||||
|
||||
authorize @passport
|
||||
end
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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 %>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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: Фамилия
|
||||
|
|
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.
|
||||
|
||||
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
|
||||
|
||||
|
|
|
@ -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 }
|
||||
|
|
|
@ -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 }
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Reference in a new issue