Files
grecia/app/controllers/debates_controller.rb
Javi Martín 97e826f2a4 Don't use update_attribute
This method is ambiguous. Sometimes we use it to set invalid data in
tests (which can usually be done with `update_column`), and other times
we use it instead of `update!`.

I'm removing it because, even if sometimes it could make sense to use
it, it's too similar to `update_attributes` (which is an alias for
`update` and runs validations), making it confusing.

However, there's one case where we're still using it: in the
ActsAsParanoidAliases module, we need to invoke the callbacks, which
`update_column` skips, but tests related to translations fail if we use
`update!`. The reason for this is the tests check what happens if we
restore a record without restoring its translations. But that will make
the record invalid, since there's a validation rule checking it has at
least one translation.

I'm not blacklisting any other method which skips validations because we
know they skip validations and use them anyway (hopefully with care).
2019-10-25 23:17:50 +02:00

77 lines
2.2 KiB
Ruby

class DebatesController < ApplicationController
include FeatureFlags
include CommentableActions
include FlagActions
include Translatable
before_action :parse_tag_filter, only: :index
before_action :authenticate_user!, except: [:index, :show, :map]
before_action :set_view, only: :index
before_action :debates_recommendations, only: :index, if: :current_user
feature_flag :debates
invisible_captcha only: [:create, :update], honeypot: :subtitle
has_orders ->(c) { Debate.debates_orders(c.current_user) }, only: :index
has_orders %w[most_voted newest oldest], only: :show
load_and_authorize_resource
helper_method :resource_model, :resource_name
respond_to :html, :js
def index_customization
@featured_debates = @debates.featured
end
def show
super
@related_contents = Kaminari.paginate_array(@debate.relationed_contents).page(params[:page]).per(5)
redirect_to debate_path(@debate), status: :moved_permanently if request.path != debate_path(@debate)
end
def vote
@debate.register_vote(current_user, params[:value])
set_debate_votes(@debate)
end
def unmark_featured
@debate.update!(featured_at: nil)
redirect_to request.query_parameters.merge(action: :index)
end
def mark_featured
@debate.update!(featured_at: Time.current)
redirect_to request.query_parameters.merge(action: :index)
end
def disable_recommendations
if current_user.update(recommended_debates: false)
redirect_to debates_path, notice: t("debates.index.recommendations.actions.success")
else
redirect_to debates_path, error: t("debates.index.recommendations.actions.error")
end
end
private
def debate_params
attributes = [:tag_list, :terms_of_service]
params.require(:debate).permit(attributes, translation_params(Debate))
end
def resource_model
Debate
end
def set_view
@view = (params[:view] == "minimal") ? "minimal" : "default"
end
def debates_recommendations
if Setting["feature.user.recommendations_on_debates"] && current_user.recommended_debates
@recommended_debates = Debate.recommendations(current_user).sort_by_random.limit(3)
end
end
end