The belongs_to_creator macro was used to initialize the creator_id field to the CurrentUser. This made tests complicated because it meant you had to create and set the current user every time you wanted to create an object, when lead to the current user being set over and over again. It also meant you had to constantly be aware of what the CurrentUser was in many different contexts, which was often confusing. Setting creators explicitly simplifies everything greatly.
116 lines
3.1 KiB
Ruby
116 lines
3.1 KiB
Ruby
class CommentsController < ApplicationController
|
|
respond_to :html, :xml, :json
|
|
respond_to :js, only: [:new, :destroy, :undelete]
|
|
before_action :member_only, :except => [:index, :search, :show]
|
|
skip_before_action :api_check
|
|
|
|
def index
|
|
params[:group_by] ||= "comment" if params[:search].present?
|
|
|
|
if params[:group_by] == "comment" || request.format == Mime::Type.lookup("application/atom+xml")
|
|
index_by_comment
|
|
elsif request.format == Mime::Type.lookup("text/javascript")
|
|
index_for_post
|
|
else
|
|
index_by_post
|
|
end
|
|
end
|
|
|
|
def search
|
|
end
|
|
|
|
def new
|
|
@comment = Comment.new(comment_params(:create))
|
|
@comment.body = Comment.find(params[:id]).quoted_response if params[:id]
|
|
respond_with(@comment)
|
|
end
|
|
|
|
def update
|
|
@comment = Comment.find(params[:id])
|
|
check_privilege(@comment)
|
|
@comment.update(comment_params(:update))
|
|
respond_with(@comment, :location => post_path(@comment.post_id))
|
|
end
|
|
|
|
def create
|
|
@comment = Comment.create(comment_params(:create).merge(creator: CurrentUser.user, creator_ip_addr: CurrentUser.ip_addr))
|
|
flash[:notice] = @comment.valid? ? "Comment posted" : @comment.errors.full_messages.join("; ")
|
|
respond_with(@comment) do |format|
|
|
format.html do
|
|
redirect_back fallback_location: (@comment.post || comments_path)
|
|
end
|
|
end
|
|
end
|
|
|
|
def edit
|
|
@comment = Comment.find(params[:id])
|
|
check_privilege(@comment)
|
|
respond_with(@comment)
|
|
end
|
|
|
|
def show
|
|
@comment = Comment.find(params[:id])
|
|
|
|
respond_with(@comment) do |format|
|
|
format.html do
|
|
redirect_to post_path(@comment.post, anchor: "comment_#{@comment.id}")
|
|
end
|
|
end
|
|
end
|
|
|
|
def destroy
|
|
@comment = Comment.find(params[:id])
|
|
check_privilege(@comment)
|
|
@comment.delete!
|
|
respond_with(@comment)
|
|
end
|
|
|
|
def undelete
|
|
@comment = Comment.find(params[:id])
|
|
check_privilege(@comment)
|
|
@comment.undelete!
|
|
respond_with(@comment)
|
|
end
|
|
|
|
private
|
|
|
|
def index_for_post
|
|
@post = Post.find(params[:post_id])
|
|
@comments = @post.comments
|
|
render :action => "index_for_post"
|
|
end
|
|
|
|
def index_by_post
|
|
@posts = Post.where("last_comment_bumped_at IS NOT NULL").tag_match(params[:tags]).reorder("last_comment_bumped_at DESC NULLS LAST").paginate(params[:page], :limit => 5, :search_count => params[:search])
|
|
|
|
@posts = @posts.includes(comments: [:creator])
|
|
@posts = @posts.includes(comments: [:votes]) if CurrentUser.is_member?
|
|
|
|
respond_with(@posts)
|
|
end
|
|
|
|
def index_by_comment
|
|
@comments = Comment.includes(:creator, :updater).paginated_search(params)
|
|
respond_with(@comments) do |format|
|
|
format.atom do
|
|
@comments = @comments.includes(:post, :creator).load
|
|
end
|
|
end
|
|
end
|
|
|
|
def check_privilege(comment)
|
|
if !comment.editable_by?(CurrentUser.user)
|
|
raise User::PrivilegeError
|
|
end
|
|
end
|
|
|
|
def comment_params(context)
|
|
permitted_params = %i[body post_id]
|
|
permitted_params += %i[do_not_bump_post] if context == :create
|
|
permitted_params += %i[is_deleted] if context == :update
|
|
permitted_params += %i[is_sticky] if CurrentUser.is_moderator?
|
|
|
|
params.fetch(:comment, {}).permit(permitted_params)
|
|
end
|
|
end
|