]> source.dussan.org Git - redmine.git/commitdiff
Refactor: split WikiController#edit into #update
authorEric Davis <edavis@littlestreamsoftware.com>
Fri, 22 Oct 2010 16:20:20 +0000 (16:20 +0000)
committerEric Davis <edavis@littlestreamsoftware.com>
Fri, 22 Oct 2010 16:20:20 +0000 (16:20 +0000)
update will handle the saving and should be accessed via POST only.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4272 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/wiki_controller.rb
app/views/wiki/edit.rhtml
config/routes.rb
lib/redmine.rb
test/functional/wiki_controller_test.rb
test/integration/routing_test.rb

index 95e1943e9ccaced353881c1360b1a0b1d2909853..1c42ab5cd97d002f11193cf79d1b13318a4eab31 100644 (file)
@@ -71,34 +71,48 @@ class WikiController < ApplicationController
     @content.text = initial_page_content(@page) if @content.text.blank?
     # don't keep previous comment
     @content.comments = nil
-    if request.get?
-      # To prevent StaleObjectError exception when reverting to a previous version
-      @content.version = @page.content.version
-    else
-      if !@page.new_record? && @content.text == params[:content][:text]
-        attachments = Attachment.attach_files(@page, params[:attachments])
-        render_attachment_warning_if_needed(@page)
-        # don't save if text wasn't changed
-        redirect_to :action => 'show', :project_id => @project, :page => @page.title
-        return
-      end
-      #@content.text = params[:content][:text]
-      #@content.comments = params[:content][:comments]
-      @content.attributes = params[:content]
-      @content.author = User.current
-      # if page is new @page.save will also save content, but not if page isn't a new record
-      if (@page.new_record? ? @page.save : @content.save)
-        attachments = Attachment.attach_files(@page, params[:attachments])
-        render_attachment_warning_if_needed(@page)
-        call_hook(:controller_wiki_edit_after_save, { :params => params, :page => @page})
-        redirect_to :action => 'show', :project_id => @project, :page => @page.title
-      end
+
+    # To prevent StaleObjectError exception when reverting to a previous version
+    @content.version = @page.content.version
+  rescue ActiveRecord::StaleObjectError
+    # Optimistic locking exception
+    flash[:error] = l(:notice_locking_conflict)
+  end
+
+  verify :method => :post, :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
+  # Creates a new page or updates an existing one
+  def update
+    @page = @wiki.find_or_new_page(params[:page])    
+    return render_403 unless editable?
+    @page.content = WikiContent.new(:page => @page) if @page.new_record?
+    
+    @content = @page.content_for_version(params[:version])
+    @content.text = initial_page_content(@page) if @content.text.blank?
+    # don't keep previous comment
+    @content.comments = nil
+
+    if !@page.new_record? && params[:content].present? && @content.text == params[:content][:text]
+      attachments = Attachment.attach_files(@page, params[:attachments])
+      render_attachment_warning_if_needed(@page)
+      # don't save if text wasn't changed
+      redirect_to :action => 'show', :project_id => @project, :page => @page.title
+      return
+    end
+    @content.attributes = params[:content]
+    @content.author = User.current
+    # if page is new @page.save will also save content, but not if page isn't a new record
+    if (@page.new_record? ? @page.save : @content.save)
+      attachments = Attachment.attach_files(@page, params[:attachments])
+      render_attachment_warning_if_needed(@page)
+      call_hook(:controller_wiki_edit_after_save, { :params => params, :page => @page})
+      redirect_to :action => 'show', :project_id => @project, :page => @page.title
     end
+
   rescue ActiveRecord::StaleObjectError
     # Optimistic locking exception
     flash[:error] = l(:notice_locking_conflict)
   end
-  
+
   # rename a page
   def rename
     return render_403 unless editable?
index 19052a318acf8e108b3c324e97b04f8712e449cf..b14bfb720b3fda9a6a358773bb978c9bbd15b13a 100644 (file)
@@ -1,6 +1,6 @@
 <h2><%=h @page.pretty_title %></h2>
 
-<% form_for :content, @content, :url => {:action => 'edit', :page => @page.title}, :html => {:multipart => true, :id => 'wiki_form'} do |f| %>
+<% form_for :content, @content, :url => {:action => 'update', :page => @page.title}, :html => {:multipart => true, :id => 'wiki_form'} do |f| %>
 <%= f.hidden_field :version %>
 <%= error_messages_for 'content' %>
 
index 84d00c687a56dd61b12fbcd8c411af967d2e97ac..5676f4546ba56dc6145d44730dfdaa9de9643628 100644 (file)
@@ -41,8 +41,10 @@ ActionController::Routing::Routes.draw do |map|
     end
     
     wiki_routes.connect 'projects/:project_id/wiki/:page/:action', 
-      :action => /edit|rename|destroy|preview|protect/,
+      :action => /rename|destroy|preview|protect/,
       :conditions => {:method => :post}
+
+    wiki_routes.connect 'projects/:project_id/wiki/:page/edit', :action => 'update', :conditions => {:method => :post}
   end
   
   map.with_options :controller => 'messages' do |messages_routes|
index d5825e00fa26b215e5018d8c9433237eba1dc8ed..1a4b581ceaf90f55ad1df51202a18ae383b167fe 100644 (file)
@@ -114,7 +114,7 @@ Redmine::AccessControl.map do |map|
     map.permission :view_wiki_pages, :wiki => [:show, :special, :page_index, :date_index]
     map.permission :export_wiki_pages, :wiki => [:export]
     map.permission :view_wiki_edits, :wiki => [:history, :diff, :annotate]
-    map.permission :edit_wiki_pages, :wiki => [:edit, :preview, :add_attachment]
+    map.permission :edit_wiki_pages, :wiki => [:edit, :update, :preview, :add_attachment]
     map.permission :delete_wiki_pages_attachments, {}
     map.permission :protect_wiki_pages, {:wiki => :protect}, :require => :member
   end
index cd8c3448d6b1472ccceee8423ef2a60b4a2676f2..61e265925a0489b727fb066980630ef3d3c1109c 100644 (file)
@@ -80,7 +80,7 @@ class WikiControllerTest < ActionController::TestCase
   
   def test_create_page
     @request.session[:user_id] = 2
-    post :edit, :project_id => 1,
+    post :update, :project_id => 1,
                 :page => 'New page',
                 :content => {:comments => 'Created the page',
                              :text => "h1. New page\n\nThis is a new page",
@@ -96,7 +96,7 @@ class WikiControllerTest < ActionController::TestCase
     @request.session[:user_id] = 2
     assert_difference 'WikiPage.count' do
       assert_difference 'Attachment.count' do
-        post :edit, :project_id => 1,
+        post :update, :project_id => 1,
                     :page => 'New page',
                     :content => {:comments => 'Created the page',
                                  :text => "h1. New page\n\nThis is a new page",
index f44d3c94e81874ed64595a1ee459c34c3c4e5938..084330c1c1d114f4f72b95820a11494219ea69f7 100644 (file)
@@ -322,7 +322,7 @@ class RoutingTest < ActionController::IntegrationTest
     should_route :get, "/projects/567/wiki/date_index", :controller => 'wiki', :action => 'date_index', :project_id => '567'
     should_route :get, "/projects/567/wiki/export", :controller => 'wiki', :action => 'export', :project_id => '567'
     
-    should_route :post, "/projects/567/wiki/my_page/edit", :controller => 'wiki', :action => 'edit', :project_id => '567', :page => 'my_page'
+    should_route :post, "/projects/567/wiki/my_page/edit", :controller => 'wiki', :action => 'update', :project_id => '567', :page => 'my_page'
     should_route :post, "/projects/567/wiki/CookBook_documentation/preview", :controller => 'wiki', :action => 'preview', :project_id => '567', :page => 'CookBook_documentation'
     should_route :post, "/projects/22/wiki/ladida/rename", :controller => 'wiki', :action => 'rename', :project_id => '22', :page => 'ladida'
     should_route :post, "/projects/22/wiki/ladida/destroy", :controller => 'wiki', :action => 'destroy', :project_id => '22', :page => 'ladida'