diff options
| author | hukl <contact@smyck.org> | 2009-09-10 12:00:03 +0200 |
|---|---|---|
| committer | hukl <contact@smyck.org> | 2009-09-10 12:00:03 +0200 |
| commit | 8afffc09bcaa4d1c77f1ca575fd5978423631bff (patch) | |
| tree | cc9c4d8d402337903584d845f5f2df6afdc52ba1 | |
| parent | f7ce8c245fde3f6202103ae614b181c0ba44ed93 (diff) | |
refactored the create method to actually produce meaningful error messages when something goes wrong. added tests for corner cases
| -rw-r--r-- | app/controllers/nodes_controller.rb | 36 | ||||
| -rw-r--r-- | app/models/node.rb | 3 | ||||
| -rw-r--r-- | app/views/nodes/create.html.erb | 2 | ||||
| -rw-r--r-- | test/functional/nodes_controller_test.rb | 16 |
4 files changed, 44 insertions, 13 deletions
diff --git a/app/controllers/nodes_controller.rb b/app/controllers/nodes_controller.rb index 0d4a3fe..b34c19e 100644 --- a/app/controllers/nodes_controller.rb +++ b/app/controllers/nodes_controller.rb | |||
| @@ -26,23 +26,24 @@ class NodesController < ApplicationController | |||
| 26 | def new | 26 | def new |
| 27 | @node = Node.new params[:node] | 27 | @node = Node.new params[:node] |
| 28 | end | 28 | end |
| 29 | 29 | ||
| 30 | def create | 30 | def create |
| 31 | parent = case params[:kind] | 31 | params[:title] ||= "" |
| 32 | when "top_level" then Node.root | ||
| 33 | when "update" then Update.find_or_create_parent | ||
| 34 | when "generic" then Node.find(params[:parent_id]) | ||
| 35 | end | ||
| 36 | 32 | ||
| 37 | if parent | 33 | @node = Node.new |
| 38 | @node = parent.children.create(:slug => params[:title].parameterize.to_s) | 34 | @node.parent_id = find_parent |
| 35 | @node.slug = params[:title].parameterize.to_s | ||
| 36 | |||
| 37 | if @node.save | ||
| 39 | @node.draft.update_attributes(:title => params[:title]) | 38 | @node.draft.update_attributes(:title => params[:title]) |
| 40 | redirect_to(edit_node_path(@node)) | 39 | redirect_to(edit_node_path(@node)) |
| 41 | else | 40 | else |
| 42 | render :action => :new | 41 | debugger |
| 42 | #@node.errors.add_to_base("Titel zu kurz") if @node.errors["slug"] | ||
| 43 | render :new | ||
| 43 | end | 44 | end |
| 44 | end | 45 | end |
| 45 | 46 | ||
| 46 | def show | 47 | def show |
| 47 | @page = Node.find(params[:id]).pages.last | 48 | @page = Node.find(params[:id]).pages.last |
| 48 | end | 49 | end |
| @@ -105,4 +106,19 @@ class NodesController < ApplicationController | |||
| 105 | def find_node | 106 | def find_node |
| 106 | @node = Node.find(params[:id]) | 107 | @node = Node.find(params[:id]) |
| 107 | end | 108 | end |
| 109 | |||
| 110 | def find_parent | ||
| 111 | case params[:kind] | ||
| 112 | when "top_level" | ||
| 113 | Node.root.id | ||
| 114 | when "update" | ||
| 115 | Update.find_or_create_parent.id | ||
| 116 | when "generic" | ||
| 117 | if params[:parent_id] && Node.find(params[:parent_id]) | ||
| 118 | params[:parent_id] | ||
| 119 | else | ||
| 120 | nil | ||
| 121 | end | ||
| 122 | end | ||
| 123 | end | ||
| 108 | end | 124 | end |
diff --git a/app/models/node.rb b/app/models/node.rb index 057248e..fa9d519 100644 --- a/app/models/node.rb +++ b/app/models/node.rb | |||
| @@ -16,7 +16,8 @@ class Node < ActiveRecord::Base | |||
| 16 | after_save :update_unique_names_of_children | 16 | after_save :update_unique_names_of_children |
| 17 | 17 | ||
| 18 | # Validations | 18 | # Validations |
| 19 | # validates_length_of :slug, :within => 3..40 | 19 | validates_length_of :slug, :within => 1..255 |
| 20 | validates_presence_of :slug | ||
| 20 | validates_uniqueness_of :slug, :scope => :parent_id | 21 | validates_uniqueness_of :slug, :scope => :parent_id |
| 21 | 22 | ||
| 22 | # Index for Fulltext Search | 23 | # Index for Fulltext Search |
diff --git a/app/views/nodes/create.html.erb b/app/views/nodes/create.html.erb deleted file mode 100644 index 05b6282..0000000 --- a/app/views/nodes/create.html.erb +++ /dev/null | |||
| @@ -1,2 +0,0 @@ | |||
| 1 | <h1>Nodes#create</h1> | ||
| 2 | <p>Find me in app/views/nodes/create.html.erb</p> | ||
diff --git a/test/functional/nodes_controller_test.rb b/test/functional/nodes_controller_test.rb index 08e50fd..801f2c0 100644 --- a/test/functional/nodes_controller_test.rb +++ b/test/functional/nodes_controller_test.rb | |||
| @@ -70,6 +70,22 @@ class NodesControllerTest < ActionController::TestCase | |||
| 70 | assert_equal 1, Node.last.level | 70 | assert_equal 1, Node.last.level |
| 71 | end | 71 | end |
| 72 | 72 | ||
| 73 | test "creating a top_level node without a title should not work" do | ||
| 74 | login_as :quentin | ||
| 75 | |||
| 76 | assert_no_difference "Node.count" do | ||
| 77 | post(:create, :kind => "top_level") | ||
| 78 | end | ||
| 79 | end | ||
| 80 | |||
| 81 | test "creating a generic node without a parent_id should not work" do | ||
| 82 | login_as :quentin | ||
| 83 | |||
| 84 | assert_no_difference "Node.count" do | ||
| 85 | post(:create, :kind => "generic") | ||
| 86 | end | ||
| 87 | end | ||
| 88 | |||
| 73 | def test_editing_a_node | 89 | def test_editing_a_node |
| 74 | login_as :quentin | 90 | login_as :quentin |
| 75 | 91 | ||
