We were using `Setting["url"]` to verify the content belonged to the application URL, but we can use `root_url` instead. Note that means we need to include the port when filling in forms in the tests, since in tests URL helpers like `polymorphic_url` don't include the port, but a port is automatically added when actually making the request.
67 lines
1.8 KiB
Ruby
67 lines
1.8 KiB
Ruby
class RelatedContentsController < ApplicationController
|
|
skip_authorization_check
|
|
|
|
respond_to :html, :js
|
|
|
|
def create
|
|
related_content = current_user.related_contents.new(
|
|
parent_relationable_id: params[:relationable_id],
|
|
parent_relationable_type: params[:relationable_klass],
|
|
child_relationable_id: child_relationable_params[:id],
|
|
child_relationable_type: child_relationable_params[:type]
|
|
)
|
|
|
|
if related_content.save
|
|
flash[:success] = t("related_content.success")
|
|
elsif related_content.same_parent_and_child?
|
|
flash[:error] = t("related_content.error_itself")
|
|
elsif related_content.duplicate?
|
|
flash[:error] = t("related_content.error_duplicate")
|
|
else
|
|
flash[:error] = t("related_content.error", url: root_url)
|
|
end
|
|
redirect_to polymorphic_path(related_content.parent_relationable)
|
|
end
|
|
|
|
def score_positive
|
|
score(:positive)
|
|
end
|
|
|
|
def score_negative
|
|
score(:negative)
|
|
end
|
|
|
|
private
|
|
|
|
def score(action)
|
|
@related = RelatedContent.find params[:id]
|
|
@related.send("score_#{action}", current_user)
|
|
|
|
render template: "relationable/_refresh_score_actions"
|
|
end
|
|
|
|
def valid_url?
|
|
params[:url].start_with?(root_url)
|
|
end
|
|
|
|
def child_relationable_params
|
|
@child_relationable_params ||=
|
|
if valid_url?
|
|
related_params = Rails.application.routes.recognize_path(params[:url])
|
|
|
|
if RelatedContent::RELATIONABLE_MODELS.include?(related_params[:controller].split("/").last)
|
|
{
|
|
id: related_params[:id],
|
|
type: related_params[:controller].split("/").map(&:singularize).join("/").classify
|
|
}
|
|
else
|
|
{}
|
|
end
|
|
else
|
|
{}
|
|
end
|
|
rescue ActionController::RoutingError
|
|
{}
|
|
end
|
|
end
|