Merge pull request #1721 from consul/feature/add_slugs_to_budget_related
Add slugs to budget related
This commit is contained in:
@@ -1,13 +1,15 @@
|
|||||||
class Budget < ActiveRecord::Base
|
class Budget < ActiveRecord::Base
|
||||||
|
|
||||||
include Measurable
|
include Measurable
|
||||||
|
include Sluggable
|
||||||
|
|
||||||
PHASES = %w(accepting reviewing selecting valuating balloting reviewing_ballots finished).freeze
|
PHASES = %w(accepting reviewing selecting valuating balloting reviewing_ballots finished).freeze
|
||||||
CURRENCY_SYMBOLS = %w(€ $ £ ¥).freeze
|
CURRENCY_SYMBOLS = %w(€ $ £ ¥).freeze
|
||||||
|
|
||||||
validates :name, presence: true
|
validates :name, presence: true, uniqueness: true
|
||||||
validates :phase, inclusion: { in: PHASES }
|
validates :phase, inclusion: { in: PHASES }
|
||||||
validates :currency_symbol, presence: true
|
validates :currency_symbol, presence: true
|
||||||
|
validates :slug, presence: true, format: /\A[a-z0-9\-_]+\z/
|
||||||
|
|
||||||
has_many :investments, dependent: :destroy
|
has_many :investments, dependent: :destroy
|
||||||
has_many :ballots, dependent: :destroy
|
has_many :ballots, dependent: :destroy
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
class Budget
|
class Budget
|
||||||
class Group < ActiveRecord::Base
|
class Group < ActiveRecord::Base
|
||||||
|
include Sluggable
|
||||||
|
|
||||||
belongs_to :budget
|
belongs_to :budget
|
||||||
|
|
||||||
has_many :headings, dependent: :destroy
|
has_many :headings, dependent: :destroy
|
||||||
|
|
||||||
validates :budget_id, presence: true
|
validates :budget_id, presence: true
|
||||||
validates :name, presence: true
|
validates :name, presence: true, uniqueness: { scope: :budget }
|
||||||
|
validates :slug, presence: true, format: /\A[a-z0-9\-_]+\z/
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,12 +1,15 @@
|
|||||||
class Budget
|
class Budget
|
||||||
class Heading < ActiveRecord::Base
|
class Heading < ActiveRecord::Base
|
||||||
|
include Sluggable
|
||||||
|
|
||||||
belongs_to :group
|
belongs_to :group
|
||||||
|
|
||||||
has_many :investments
|
has_many :investments
|
||||||
|
|
||||||
validates :group_id, presence: true
|
validates :group_id, presence: true
|
||||||
validates :name, presence: true
|
validates :name, presence: true, uniqueness: { if: :name_exists_in_budget_headings }
|
||||||
validates :price, presence: true
|
validates :price, presence: true
|
||||||
|
validates :slug, presence: true, format: /\A[a-z0-9\-_]+\z/
|
||||||
|
|
||||||
delegate :budget, :budget_id, to: :group, allow_nil: true
|
delegate :budget, :budget_id, to: :group, allow_nil: true
|
||||||
|
|
||||||
@@ -16,5 +19,9 @@ class Budget
|
|||||||
"#{group.name}: #{name}"
|
"#{group.name}: #{name}"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def name_exists_in_budget_headings
|
||||||
|
group.budget.headings.where(name: name).any?
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
11
app/models/concerns/sluggable.rb
Normal file
11
app/models/concerns/sluggable.rb
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
module Sluggable
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
included do
|
||||||
|
before_validation :generate_slug
|
||||||
|
end
|
||||||
|
|
||||||
|
def generate_slug
|
||||||
|
self.slug = name.to_s.parameterize
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
class AddSlugsToBudgetHeadingGroup < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_column :budgets, :slug, :string
|
||||||
|
add_column :budget_groups, :slug, :string
|
||||||
|
add_column :budget_headings, :slug, :string
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -11,7 +11,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: 20170703120055) do
|
ActiveRecord::Schema.define(version: 20170704105112) 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"
|
||||||
@@ -103,6 +103,7 @@ ActiveRecord::Schema.define(version: 20170703120055) do
|
|||||||
create_table "budget_groups", force: :cascade do |t|
|
create_table "budget_groups", force: :cascade do |t|
|
||||||
t.integer "budget_id"
|
t.integer "budget_id"
|
||||||
t.string "name", limit: 50
|
t.string "name", limit: 50
|
||||||
|
t.string "slug"
|
||||||
end
|
end
|
||||||
|
|
||||||
add_index "budget_groups", ["budget_id"], name: "index_budget_groups_on_budget_id", using: :btree
|
add_index "budget_groups", ["budget_id"], name: "index_budget_groups_on_budget_id", using: :btree
|
||||||
@@ -112,6 +113,7 @@ ActiveRecord::Schema.define(version: 20170703120055) do
|
|||||||
t.string "name", limit: 50
|
t.string "name", limit: 50
|
||||||
t.integer "price", limit: 8
|
t.integer "price", limit: 8
|
||||||
t.integer "population"
|
t.integer "population"
|
||||||
|
t.string "slug"
|
||||||
end
|
end
|
||||||
|
|
||||||
add_index "budget_headings", ["group_id"], name: "index_budget_headings_on_group_id", using: :btree
|
add_index "budget_headings", ["group_id"], name: "index_budget_headings_on_group_id", using: :btree
|
||||||
@@ -196,6 +198,7 @@ ActiveRecord::Schema.define(version: 20170703120055) do
|
|||||||
t.text "description_balloting"
|
t.text "description_balloting"
|
||||||
t.text "description_reviewing_ballots"
|
t.text "description_reviewing_ballots"
|
||||||
t.text "description_finished"
|
t.text "description_finished"
|
||||||
|
t.string "slug"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "campaigns", force: :cascade do |t|
|
create_table "campaigns", force: :cascade do |t|
|
||||||
|
|||||||
8
lib/tasks/slugs.rake
Normal file
8
lib/tasks/slugs.rake
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
namespace :slugs do
|
||||||
|
desc "Generate slug attribute for objects from classes that use Sluggable concern"
|
||||||
|
task generate: :environment do
|
||||||
|
%w(Budget Budget::Heading Budget::Group).each do |class_name|
|
||||||
|
class_name.constantize.all.each(&:generate_slug)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
23
spec/models/budget/group_spec.rb
Normal file
23
spec/models/budget/group_spec.rb
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
describe Budget::Group do
|
||||||
|
|
||||||
|
it_behaves_like "sluggable"
|
||||||
|
|
||||||
|
let(:budget) { create(:budget) }
|
||||||
|
|
||||||
|
describe "name" do
|
||||||
|
before do
|
||||||
|
create(:budget_group, budget: budget, name: 'object name')
|
||||||
|
end
|
||||||
|
|
||||||
|
it "can be repeatead in other budget's groups" do
|
||||||
|
expect(build(:budget_group, budget: create(:budget), name: 'object name')).to be_valid
|
||||||
|
end
|
||||||
|
|
||||||
|
it "must be unique among all budget's groups" do
|
||||||
|
expect(build(:budget_group, budget: budget, name: 'object name')).not_to be_valid
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
28
spec/models/budget/heading_spec.rb
Normal file
28
spec/models/budget/heading_spec.rb
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
describe Budget::Heading do
|
||||||
|
|
||||||
|
it_behaves_like "sluggable"
|
||||||
|
|
||||||
|
let(:budget) { create(:budget) }
|
||||||
|
let(:group) { create(:budget_group, budget: budget) }
|
||||||
|
|
||||||
|
describe "name" do
|
||||||
|
before do
|
||||||
|
create(:budget_heading, group: group, name: 'object name')
|
||||||
|
end
|
||||||
|
|
||||||
|
it "can be repeatead in other budget's groups" do
|
||||||
|
expect(build(:budget_heading, group: create(:budget_group), name: 'object name')).to be_valid
|
||||||
|
end
|
||||||
|
|
||||||
|
it "must be unique among all budget's groups" do
|
||||||
|
expect(build(:budget_heading, group: create(:budget_group, budget: budget), name: 'object name')).not_to be_valid
|
||||||
|
end
|
||||||
|
|
||||||
|
it "must be unique among all it's group" do
|
||||||
|
expect(build(:budget_heading, group: group, name: 'object name')).not_to be_valid
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@@ -2,6 +2,18 @@ require 'rails_helper'
|
|||||||
|
|
||||||
describe Budget do
|
describe Budget do
|
||||||
|
|
||||||
|
it_behaves_like "sluggable"
|
||||||
|
|
||||||
|
describe "name" do
|
||||||
|
before do
|
||||||
|
create(:budget, name: 'object name')
|
||||||
|
end
|
||||||
|
|
||||||
|
it "is validated for uniqueness" do
|
||||||
|
expect(build(:budget, name: 'object name')).not_to be_valid
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "description" do
|
describe "description" do
|
||||||
it "changes depending on the phase" do
|
it "changes depending on the phase" do
|
||||||
budget = create(:budget)
|
budget = create(:budget)
|
||||||
|
|||||||
16
spec/models/concerns/sluggable.rb
Normal file
16
spec/models/concerns/sluggable.rb
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
shared_examples_for 'sluggable' do
|
||||||
|
|
||||||
|
describe 'generate_slug' do
|
||||||
|
before do
|
||||||
|
create(described_class.name.parameterize.tr('-', '_').to_sym, name: "Marlo Brañido Carlo")
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when a new sluggable is created" do
|
||||||
|
it "gets a slug string" do
|
||||||
|
expect(described_class.last.slug).to eq("marlo-branido-carlo")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user