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 # GET /passports/new
def new def new
@passport = Passport.new @passport = Passport.new
@passport.build_passport_map
authorize @passport authorize @passport
end end

View file

@ -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

View file

@ -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

View file

@ -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 %>

View file

@ -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>

View file

@ -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

View file

@ -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: Фамилия

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. # 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

View file

@ -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 }

View file

@ -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 }

View file

@ -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

View file

@ -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

View file

@ -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