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
|
||||
|
||||
include Measurable
|
||||
include Sluggable
|
||||
|
||||
PHASES = %w(accepting reviewing selecting valuating balloting reviewing_ballots finished).freeze
|
||||
CURRENCY_SYMBOLS = %w(€ $ £ ¥).freeze
|
||||
|
||||
validates :name, presence: true
|
||||
validates :name, presence: true, uniqueness: true
|
||||
validates :phase, inclusion: { in: PHASES }
|
||||
validates :currency_symbol, presence: true
|
||||
validates :slug, presence: true, format: /\A[a-z0-9\-_]+\z/
|
||||
|
||||
has_many :investments, dependent: :destroy
|
||||
has_many :ballots, dependent: :destroy
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
class Budget
|
||||
class Group < ActiveRecord::Base
|
||||
include Sluggable
|
||||
|
||||
belongs_to :budget
|
||||
|
||||
has_many :headings, dependent: :destroy
|
||||
|
||||
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
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
class Budget
|
||||
class Heading < ActiveRecord::Base
|
||||
include Sluggable
|
||||
|
||||
belongs_to :group
|
||||
|
||||
has_many :investments
|
||||
|
||||
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 :slug, presence: true, format: /\A[a-z0-9\-_]+\z/
|
||||
|
||||
delegate :budget, :budget_id, to: :group, allow_nil: true
|
||||
|
||||
@@ -16,5 +19,9 @@ class Budget
|
||||
"#{group.name}: #{name}"
|
||||
end
|
||||
|
||||
def name_exists_in_budget_headings
|
||||
group.budget.headings.where(name: name).any?
|
||||
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.
|
||||
|
||||
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
|
||||
enable_extension "plpgsql"
|
||||
@@ -103,6 +103,7 @@ ActiveRecord::Schema.define(version: 20170703120055) do
|
||||
create_table "budget_groups", force: :cascade do |t|
|
||||
t.integer "budget_id"
|
||||
t.string "name", limit: 50
|
||||
t.string "slug"
|
||||
end
|
||||
|
||||
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.integer "price", limit: 8
|
||||
t.integer "population"
|
||||
t.string "slug"
|
||||
end
|
||||
|
||||
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_reviewing_ballots"
|
||||
t.text "description_finished"
|
||||
t.string "slug"
|
||||
end
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
it "changes depending on the phase" do
|
||||
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