From 1f2f9536875a0383f0ac61e0fdd089b666c96070 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Wed, 22 Sep 2010 16:25:09 +0000 Subject: [PATCH] Refactor: move NewsController#add_comment to CommentsController#create git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4170 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/controllers/comments_controller.rb | 30 ++++++++++++++ app/controllers/news_controller.rb | 12 ------ app/views/news/show.rhtml | 4 +- config/routes.rb | 2 + lib/redmine.rb | 2 +- test/functional/comments_controller_test.rb | 46 +++++++++++++++++++++ test/functional/news_controller_test.rb | 20 --------- test/integration/routing_test.rb | 3 +- 8 files changed, 83 insertions(+), 36 deletions(-) create mode 100644 app/controllers/comments_controller.rb create mode 100644 test/functional/comments_controller_test.rb diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb new file mode 100644 index 00000000000..c0d524a2516 --- /dev/null +++ b/app/controllers/comments_controller.rb @@ -0,0 +1,30 @@ +class CommentsController < ApplicationController + default_search_scope :news + model_object News + before_filter :find_model_object + before_filter :find_project_from_association + before_filter :authorize + + verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed } + def create + @comment = Comment.new(params[:comment]) + @comment.author = User.current + if @news.comments << @comment + flash[:notice] = l(:label_comment_added) + end + + redirect_to :controller => 'news', :action => 'show', :id => @news + end + + private + + # ApplicationController's find_model_object sets it based on the controller + # name so it needs to be overriden and set to @news instead + def find_model_object + super + @news = @object + @comment = nil + @news + end + +end diff --git a/app/controllers/news_controller.rb b/app/controllers/news_controller.rb index 5a1d36e0f9f..d15ae3291c2 100644 --- a/app/controllers/news_controller.rb +++ b/app/controllers/news_controller.rb @@ -73,18 +73,6 @@ def update end end - def add_comment - @comment = Comment.new(params[:comment]) - @comment.author = User.current - if @news.comments << @comment - flash[:notice] = l(:label_comment_added) - redirect_to :action => 'show', :id => @news - else - show - render :action => 'show' - end - end - def destroy_comment @news.comments.find(params[:comment_id]).destroy redirect_to :action => 'show', :id => @news diff --git a/app/views/news/show.rhtml b/app/views/news/show.rhtml index 851ef3f7586..9b8f2510e67 100644 --- a/app/views/news/show.rhtml +++ b/app/views/news/show.rhtml @@ -47,9 +47,9 @@ <% end if @comments.any? %> -<% if authorize_for 'news', 'add_comment' %> +<% if authorize_for 'comments', 'create' %>

<%= toggle_link l(:label_comment_add), "add_comment_form", :focus => "comment_comments" %>

-<% form_tag({:action => 'add_comment', :id => @news}, :id => "add_comment_form", :style => "display:none;") do %> +<% form_tag({:controller => 'comments', :action => 'create', :id => @news}, :id => "add_comment_form", :style => "display:none;") do %>
<%= text_area 'comment', 'comments', :cols => 80, :rows => 15, :class => 'wiki-edit' %> <%= wikitoolbar_for 'comment_comments' %> diff --git a/config/routes.rb b/config/routes.rb index 2950cba2180..6c765dab15d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -152,6 +152,8 @@ news_actions.connect 'news/:id/destroy', :action => 'destroy' end news_routes.connect 'news/:id/edit', :action => 'update', :conditions => {:method => :put} + + news_routes.connect 'news/:id/comments', :controller => 'comments', :action => 'create', :conditions => {:method => :post} end map.connect 'projects/:id/members/new', :controller => 'members', :action => 'new' diff --git a/lib/redmine.rb b/lib/redmine.rb index a7417df880c..198d37304bb 100644 --- a/lib/redmine.rb +++ b/lib/redmine.rb @@ -93,7 +93,7 @@ map.project_module :news do |map| map.permission :manage_news, {:news => [:new, :create, :edit, :update, :destroy, :destroy_comment]}, :require => :member map.permission :view_news, {:news => [:index, :show]}, :public => true - map.permission :comment_news, {:news => :add_comment} + map.permission :comment_news, {:comments => :create} end map.project_module :documents do |map| diff --git a/test/functional/comments_controller_test.rb b/test/functional/comments_controller_test.rb new file mode 100644 index 00000000000..1a9d628d820 --- /dev/null +++ b/test/functional/comments_controller_test.rb @@ -0,0 +1,46 @@ +# redMine - project management software +# Copyright (C) 2006-2007 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require File.dirname(__FILE__) + '/../test_helper' + +class CommentsControllerTest < ActionController::TestCase + fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, :news, :comments + + def setup + User.current = nil + end + + def test_add_comment + @request.session[:user_id] = 2 + post :create, :id => 1, :comment => { :comments => 'This is a test comment' } + assert_redirected_to 'news/1' + + comment = News.find(1).comments.find(:first, :order => 'created_on DESC') + assert_not_nil comment + assert_equal 'This is a test comment', comment.comments + assert_equal User.find(2), comment.author + end + + def test_empty_comment_should_not_be_added + @request.session[:user_id] = 2 + assert_no_difference 'Comment.count' do + post :create, :id => 1, :comment => { :comments => '' } + assert_response :redirect + assert_redirected_to 'news/1' + end + end +end diff --git a/test/functional/news_controller_test.rb b/test/functional/news_controller_test.rb index 5f00fd914d6..ddc8b0c2c73 100644 --- a/test/functional/news_controller_test.rb +++ b/test/functional/news_controller_test.rb @@ -111,26 +111,6 @@ def test_post_create_with_validation_failure :content => /1 error/ end - def test_add_comment - @request.session[:user_id] = 2 - post :add_comment, :id => 1, :comment => { :comments => 'This is a NewsControllerTest comment' } - assert_redirected_to 'news/1' - - comment = News.find(1).comments.find(:first, :order => 'created_on DESC') - assert_not_nil comment - assert_equal 'This is a NewsControllerTest comment', comment.comments - assert_equal User.find(2), comment.author - end - - def test_empty_comment_should_not_be_added - @request.session[:user_id] = 2 - assert_no_difference 'Comment.count' do - post :add_comment, :id => 1, :comment => { :comments => '' } - assert_response :success - assert_template 'show' - end - end - def test_destroy_comment comments_count = News.find(1).comments.size @request.session[:user_id] = 2 diff --git a/test/integration/routing_test.rb b/test/integration/routing_test.rb index 0daaad6dc10..4ce8fe4a7eb 100644 --- a/test/integration/routing_test.rb +++ b/test/integration/routing_test.rb @@ -160,7 +160,8 @@ class RoutingTest < ActionController::IntegrationTest should_route :post, "/projects/567/news", :controller => 'news', :action => 'create', :project_id => '567' should_route :post, "/news/567/destroy", :controller => 'news', :action => 'destroy', :id => '567' - + should_route :post, "/news/567/comments", :controller => 'comments', :action => 'create', :id => '567' + should_route :put, "/news/567/edit", :controller => 'news', :action => 'update', :id => '567' end