When customizing CONSUL, one of the most common actions is adding a new
field to a form.
This requires modifying the permitted/allowed parameters. However, in
most cases, the method returning these parameters returned an instance
of `ActionController::Parameters`, so adding more parameters to it
wasn't easy.
So customizing the code required copying the method returning those
parameters and adding the new ones. For example:
```
def something_params
params.require(:something).permit(
:one_consul_attribute,
:another_consul_attribute,
:my_custom_attribute
)
end
```
This meant that, if the `something_params` method changed in CONSUL, the
customization of this method had to be updated as well.
So we're extracting the logic returning the parameters to a method which
returns an array. Now this code can be customized without copying the
original method:
```
alias_method :consul_allowed_params, :allowed_params
def allowed_params
consul_allowed_params + [:my_custom_attribute]
end
```
81 lines
2.0 KiB
Ruby
81 lines
2.0 KiB
Ruby
module Budgets
|
|
module Ballot
|
|
class LinesController < ApplicationController
|
|
before_action :authenticate_user!
|
|
before_action :load_budget
|
|
before_action :load_ballot
|
|
before_action :load_tag_cloud
|
|
before_action :load_categories
|
|
before_action :load_investments
|
|
|
|
authorize_resource :budget
|
|
authorize_resource :ballot
|
|
load_and_authorize_resource :line, through: :ballot, find_by: :investment_id, class: "Budget::Ballot::Line"
|
|
|
|
def create
|
|
load_investment
|
|
load_heading
|
|
load_map
|
|
|
|
@ballot.add_investment(@investment)
|
|
end
|
|
|
|
def destroy
|
|
@investment = @line.investment
|
|
load_heading
|
|
load_map
|
|
|
|
@line.destroy!
|
|
load_investments
|
|
end
|
|
|
|
private
|
|
|
|
def line_params
|
|
params.permit(allowed_params)
|
|
end
|
|
|
|
def allowed_params
|
|
[:investment_id, :budget_id]
|
|
end
|
|
|
|
def load_budget
|
|
@budget = Budget.find_by_slug_or_id! params[:budget_id]
|
|
end
|
|
|
|
def load_ballot
|
|
@ballot = Budget::Ballot.where(user: current_user, budget: @budget).first_or_create!
|
|
end
|
|
|
|
def load_investment
|
|
@investment = Budget::Investment.find(params[:investment_id])
|
|
end
|
|
|
|
def load_investments
|
|
if params[:investments_ids].present?
|
|
@investment_ids = params[:investments_ids]
|
|
@investments = Budget::Investment.where(id: params[:investments_ids])
|
|
end
|
|
end
|
|
|
|
def load_heading
|
|
@heading = @investment.heading
|
|
end
|
|
|
|
def load_tag_cloud
|
|
@tag_cloud = TagCloud.new(Budget::Investment, params[:search])
|
|
end
|
|
|
|
def load_categories
|
|
@categories = Tag.category.order(:name)
|
|
end
|
|
|
|
def load_map
|
|
@investments ||= []
|
|
@investments_map_coordinates = MapLocation.where(investment: @investments).map(&:json_data)
|
|
@map_location = MapLocation.load_from_heading(@heading)
|
|
end
|
|
end
|
|
end
|
|
end
|