Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also compare across forks.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also compare across forks.
base fork: rondy/todo
base: bb02c11eda
...
head fork: rondy/todo
compare: 8d565831c6
  • 6 commits
  • 22 files changed
  • 0 commit comments
  • 1 contributor
View
265 README
@@ -1,261 +1,4 @@
-== Welcome to Rails
-
-Rails is a web-application framework that includes everything needed to create
-database-backed web applications according to the Model-View-Control pattern.
-
-This pattern splits the view (also called the presentation) into "dumb"
-templates that are primarily responsible for inserting pre-built data in between
-HTML tags. The model contains the "smart" domain objects (such as Account,
-Product, Person, Post) that holds all the business logic and knows how to
-persist themselves to a database. The controller handles the incoming requests
-(such as Save New Account, Update Product, Show Post) by manipulating the model
-and directing data to the view.
-
-In Rails, the model is handled by what's called an object-relational mapping
-layer entitled Active Record. This layer allows you to present the data from
-database rows as objects and embellish these data objects with business logic
-methods. You can read more about Active Record in
-link:files/vendor/rails/activerecord/README.html.
-
-The controller and view are handled by the Action Pack, which handles both
-layers by its two parts: Action View and Action Controller. These two layers
-are bundled in a single package due to their heavy interdependence. This is
-unlike the relationship between the Active Record and Action Pack that is much
-more separate. Each of these packages can be used independently outside of
-Rails. You can read more about Action Pack in
-link:files/vendor/rails/actionpack/README.html.
-
-
-== Getting Started
-
-1. At the command prompt, create a new Rails application:
- <tt>rails new myapp</tt> (where <tt>myapp</tt> is the application name)
-
-2. Change directory to <tt>myapp</tt> and start the web server:
- <tt>cd myapp; rails server</tt> (run with --help for options)
-
-3. Go to http://localhost:3000/ and you'll see:
- "Welcome aboard: You're riding Ruby on Rails!"
-
-4. Follow the guidelines to start developing your application. You can find
-the following resources handy:
-
-* The Getting Started Guide: http://guides.rubyonrails.org/getting_started.html
-* Ruby on Rails Tutorial Book: http://www.railstutorial.org/
-
-
-== Debugging Rails
-
-Sometimes your application goes wrong. Fortunately there are a lot of tools that
-will help you debug it and get it back on the rails.
-
-First area to check is the application log files. Have "tail -f" commands
-running on the server.log and development.log. Rails will automatically display
-debugging and runtime information to these files. Debugging info will also be
-shown in the browser on requests from 127.0.0.1.
-
-You can also log your own messages directly into the log file from your code
-using the Ruby logger class from inside your controllers. Example:
-
- class WeblogController < ActionController::Base
- def destroy
- @weblog = Weblog.find(params[:id])
- @weblog.destroy
- logger.info("#{Time.now} Destroyed Weblog ID ##{@weblog.id}!")
- end
- end
-
-The result will be a message in your log file along the lines of:
-
- Mon Oct 08 14:22:29 +1000 2007 Destroyed Weblog ID #1!
-
-More information on how to use the logger is at http://www.ruby-doc.org/core/
-
-Also, Ruby documentation can be found at http://www.ruby-lang.org/. There are
-several books available online as well:
-
-* Programming Ruby: http://www.ruby-doc.org/docs/ProgrammingRuby/ (Pickaxe)
-* Learn to Program: http://pine.fm/LearnToProgram/ (a beginners guide)
-
-These two books will bring you up to speed on the Ruby language and also on
-programming in general.
-
-
-== Debugger
-
-Debugger support is available through the debugger command when you start your
-Mongrel or WEBrick server with --debugger. This means that you can break out of
-execution at any point in the code, investigate and change the model, and then,
-resume execution! You need to install ruby-debug to run the server in debugging
-mode. With gems, use <tt>sudo gem install ruby-debug</tt>. Example:
-
- class WeblogController < ActionController::Base
- def index
- @posts = Post.all
- debugger
- end
- end
-
-So the controller will accept the action, run the first line, then present you
-with a IRB prompt in the server window. Here you can do things like:
-
- >> @posts.inspect
- => "[#<Post:0x14a6be8
- @attributes={"title"=>nil, "body"=>nil, "id"=>"1"}>,
- #<Post:0x14a6620
- @attributes={"title"=>"Rails", "body"=>"Only ten..", "id"=>"2"}>]"
- >> @posts.first.title = "hello from a debugger"
- => "hello from a debugger"
-
-...and even better, you can examine how your runtime objects actually work:
-
- >> f = @posts.first
- => #<Post:0x13630c4 @attributes={"title"=>nil, "body"=>nil, "id"=>"1"}>
- >> f.
- Display all 152 possibilities? (y or n)
-
-Finally, when you're ready to resume execution, you can enter "cont".
-
-
-== Console
-
-The console is a Ruby shell, which allows you to interact with your
-application's domain model. Here you'll have all parts of the application
-configured, just like it is when the application is running. You can inspect
-domain models, change values, and save to the database. Starting the script
-without arguments will launch it in the development environment.
-
-To start the console, run <tt>rails console</tt> from the application
-directory.
-
-Options:
-
-* Passing the <tt>-s, --sandbox</tt> argument will rollback any modifications
- made to the database.
-* Passing an environment name as an argument will load the corresponding
- environment. Example: <tt>rails console production</tt>.
-
-To reload your controllers and models after launching the console run
-<tt>reload!</tt>
-
-More information about irb can be found at:
-link:http://www.rubycentral.org/pickaxe/irb.html
-
-
-== dbconsole
-
-You can go to the command line of your database directly through <tt>rails
-dbconsole</tt>. You would be connected to the database with the credentials
-defined in database.yml. Starting the script without arguments will connect you
-to the development database. Passing an argument will connect you to a different
-database, like <tt>rails dbconsole production</tt>. Currently works for MySQL,
-PostgreSQL and SQLite 3.
-
-== Description of Contents
-
-The default directory structure of a generated Ruby on Rails application:
-
- |-- app
- | |-- assets
- | |-- images
- | |-- javascripts
- | `-- stylesheets
- | |-- controllers
- | |-- helpers
- | |-- mailers
- | |-- models
- | `-- views
- | `-- layouts
- |-- config
- | |-- environments
- | |-- initializers
- | `-- locales
- |-- db
- |-- doc
- |-- lib
- | `-- tasks
- |-- log
- |-- public
- |-- script
- |-- test
- | |-- fixtures
- | |-- functional
- | |-- integration
- | |-- performance
- | `-- unit
- |-- tmp
- | |-- cache
- | |-- pids
- | |-- sessions
- | `-- sockets
- `-- vendor
- |-- assets
- `-- stylesheets
- `-- plugins
-
-app
- Holds all the code that's specific to this particular application.
-
-app/assets
- Contains subdirectories for images, stylesheets, and JavaScript files.
-
-app/controllers
- Holds controllers that should be named like weblogs_controller.rb for
- automated URL mapping. All controllers should descend from
- ApplicationController which itself descends from ActionController::Base.
-
-app/models
- Holds models that should be named like post.rb. Models descend from
- ActiveRecord::Base by default.
-
-app/views
- Holds the template files for the view that should be named like
- weblogs/index.html.erb for the WeblogsController#index action. All views use
- eRuby syntax by default.
-
-app/views/layouts
- Holds the template files for layouts to be used with views. This models the
- common header/footer method of wrapping views. In your views, define a layout
- using the <tt>layout :default</tt> and create a file named default.html.erb.
- Inside default.html.erb, call <% yield %> to render the view using this
- layout.
-
-app/helpers
- Holds view helpers that should be named like weblogs_helper.rb. These are
- generated for you automatically when using generators for controllers.
- Helpers can be used to wrap functionality for your views into methods.
-
-config
- Configuration files for the Rails environment, the routing map, the database,
- and other dependencies.
-
-db
- Contains the database schema in schema.rb. db/migrate contains all the
- sequence of Migrations for your schema.
-
-doc
- This directory is where your application documentation will be stored when
- generated using <tt>rake doc:app</tt>
-
-lib
- Application specific libraries. Basically, any kind of custom code that
- doesn't belong under controllers, models, or helpers. This directory is in
- the load path.
-
-public
- The directory available for the web server. Also contains the dispatchers and the
- default HTML files. This should be set as the DOCUMENT_ROOT of your web
- server.
-
-script
- Helper scripts for automation and generation.
-
-test
- Unit and functional tests along with fixtures. When using the rails generate
- command, template test files will be generated for you and placed in this
- directory.
-
-vendor
- External libraries that the application depends on. Also includes the plugins
- subdirectory. If the app has frozen rails, those gems also go here, under
- vendor/rails/. This directory is in the load path.
+<tt>
+rew install -f imagemagick --disable-openmp
+rake db:populate
+</tt>
View
1  app/assets/stylesheets/application.css
@@ -7,4 +7,5 @@
*= require layout
*= require flash_messages
*= require todo_lists
+ *= require login
*/
View
6 app/assets/stylesheets/devise.css
@@ -0,0 +1,6 @@
+/*
+ *= require reset
+ *= require global
+ *= require flash_messages
+ *= require login
+*/
View
1  app/assets/stylesheets/flash_messages.css.scss
@@ -3,6 +3,7 @@
border: 1px solid;
width: 60%;
margin: 0 auto 2em;
+ padding: 0.1em 1em;
text-align: center;
font-size: .65em;
}
View
58 app/assets/stylesheets/global.css.scss
@@ -29,6 +29,64 @@ a {
color: #33825f;
}
+form {
+
+ padding: 0 2.5em 2.5em;
+
+ label abbr {
+ color: red;
+ }
+
+ label {
+ display: block;
+ }
+
+ div.input.string input,
+ div.input.password input {
+ width: 25em;
+ }
+
+ div.input.boolean label {
+ display: inline;
+ }
+
+ span.error {
+ display: block;
+ color: red;
+ font-size: .7em;
+ }
+
+ span.hint {
+ color: #AAA;
+ font-size: .7em;
+ display: block;
+ line-height: .7em;
+ margin-bottom: 1em;
+ }
+
+ div.submit {
+ border-top: 1px solid #DDD;
+ margin-top: 1em;
+ padding-top: 1em;
+ }
+
+ input.button {
+ font-size: 1em;
+ }
+
+}
+
+div#cancel_account {
+ padding: 0 2.5em;
+}
+
+div#footer {
+ color: #AAA;
+ text-align: center;
+ font-size: .65em;
+ margin-top:1em;
+}
+
.clearfix {
overflow: hidden;
}
View
45 app/assets/stylesheets/layout.css.scss
@@ -37,12 +37,17 @@ div#menu {
a {
color: #999;
display: block;
- font-size: .9em;
+ font-size: .7em;
font-weight: bold;
float: left;
- padding: 10px 14px;
+ line-height: 3em;
+ padding: 0 10px;
text-transform: uppercase;
text-decoration: none;
+
+ &:hover {
+ color: #33825f;
+ }
}
}
@@ -51,12 +56,12 @@ div#menu {
a {
color: #000;
background-color: #FFF;
- -webkit-border-top-left-radius: 8px;
- -webkit-border-top-right-radius: 8px;
- -moz-border-radius-topleft: 8px;
- -moz-border-radius-topright: 8px;
- border-top-left-radius: 8px;
- border-top-right-radius: 8px;
+ // -webkit-border-top-left-radius: 8px;
+ // -webkit-border-top-right-radius: 8px;
+ // -moz-border-radius-topleft: 8px;
+ // -moz-border-radius-topright: 8px;
+ // border-top-left-radius: 8px;
+ // border-top-right-radius: 8px;
}
}
@@ -66,12 +71,13 @@ div#menu {
a {
color: #FFF;
- font-size: .75em;
+ font-size: .6em;
font-weight: bold;
text-decoration: none;
display:block;
- margin: .6em .6em 0 0;
- padding: .15em .85em;
+ line-height: 2.5em;
+ // margin: .6em .6em 0 0;
+ padding: 0 .85em;
background: -moz-linear-gradient(
top,
#10c200 0%,
@@ -82,9 +88,9 @@ div#menu {
from(#10c200),
color-stop(0.75, #5bb32e),
to(#118a11));
- border-radius: 6px;
- -moz-border-radius: 6px;
- -webkit-border-radius: 6px;
+ border-radius: 4px;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
border: 0px solid #2ea100;
-moz-box-shadow:
0px 1px 3px rgba(000,000,000,0.5),
@@ -102,12 +108,11 @@ div#menu {
div#content {
background-color: white;
- padding-top:1em;
+ padding:1em 0;
}
-div#footer {
- color: #AAA;
- text-align: center;
- font-size: .65em;
- margin-top:1em;
+p.empty {
+ margin: 1.5em;
+ padding: 1em;
+ background-color: #f4feed;
}
View
35 app/assets/stylesheets/login.css.scss
@@ -0,0 +1,35 @@
+div#login {
+
+ width: 25em;
+ margin: 4em auto;
+
+ #header #app_name {
+ text-align: center;
+ float:none;
+ width: auto;
+ }
+
+ h2 {
+ background-color: #EEE;
+ font-size: .7em;
+ padding: .6em 3em;
+ margin-top: 1.5em;
+ }
+
+ form {
+ background-color: #FFF;
+ padding: 1em 2.5em 1.5em;
+
+ .forgot_password {
+ font-size: .7em;
+ text-align: right;
+ }
+ }
+
+ div#devise_links {
+ margin-top: 1em;
+ padding: 1em 2.5em;
+ background-color: #FFF;
+ }
+
+}
View
40 app/assets/stylesheets/todo_lists.css.scss
@@ -51,34 +51,12 @@ div.todo_list {
form {
- padding: 0 2.5em 2.5em;
-
- label abbr {
- color: red;
- }
-
- label {
- display: block;
- }
-
- div.input.boolean label {
- display: inline;
- }
-
- span.error {
- display: block;
- color: red;
- font-size: .7em;
- }
-
- input#todo_list_name {
- font-size: 1.6em;
- font-weight: bold;
- width: 15em;
- }
-
- input.button {
- font-size: 1em;
+ div.input {
+ input#todo_list_name {
+ font-size: 1.6em;
+ font-weight: bold;
+ width: 18em;
+ }
}
div#tasks {
@@ -86,6 +64,10 @@ form {
border-bottom: 1px solid #DDD;
padding-bottom: 1em;
margin: 1em 0;
+
+ input {
+ margin-right: .5em;
+ }
a.add_child {
background: url("add.png") no-repeat;
@@ -102,6 +84,4 @@ form {
}
-
-
}
View
2  app/controllers/public_todo_lists_controller.rb
@@ -1,7 +1,7 @@
class PublicTodoListsController < TodoListsController
def index
- @public_todo_lists = TodoList.public_visibility.except_from_user(current_user)
+ @public_todo_lists = TodoList.public_visibility.except_for_user(current_user)
respond_with(@public_todo_lists)
end
View
2  app/models/todo_list.rb
@@ -11,7 +11,7 @@ class TodoList < ActiveRecord::Base
accepts_nested_attributes_for :tasks, :reject_if => lambda { |task| task["name"].blank? }, :allow_destroy => true
scope :public_visibility, where(:private => false)
- scope :except_from_user, lambda { |user| where("user_id <> ?", user) }
+ scope :except_for_user, lambda { |user| where("user_id <> ?", user) }
NUMBER_OF_TASK_FIELDS = 4
View
8 app/views/devise/passwords/new.html.erb
@@ -3,7 +3,11 @@
<%= simple_form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :post }) do |f| %>
<%= devise_error_messages! %>
<%= f.input :email, :as => :email %>
- <%= f.button :submit, "Send me reset password instructions" %>
+ <div class="submit">
+ <%= f.button :submit, "Send me reset password instructions" %>
+ </div>
<% end %>
-<%= render :partial => "devise/shared/links" %>
+<div id="devise_links">
+ <%= link_to "Sign in", new_session_path(resource_name) %> or <%= link_to "Sign up", new_registration_path(resource_name) %>
+</div>
View
16 app/views/devise/registrations/edit.html.erb
@@ -1,5 +1,3 @@
-<h2>Edit <%= resource_name.to_s.humanize %></h2>
-
<%= simple_form_for(resource, :as => resource_name,
:url => registration_path(resource_name),
:html => { :method => :put, :multipart => true }) do |f| %>
@@ -10,11 +8,17 @@
<%= f.input :password, :as => :password, :hint => "(leave blank if you don't want to change it)" %>
<%= f.input :password_confirmation, :as => :password %>
<%= f.input :current_password, :as => :password, :hint => "(we need your current password to confirm your changes)" %>
- <%= f.button :submit %>
+ <div class="submit">
+ <%= f.button :submit %>
+ </div>
<% end %>
-<h3>Cancel my account</h3>
+<div id="cancel_account">
+ <h3>Cancel my account</h3>
+
+ <p>
+ Unhappy? <%= link_to "Cancel my account", registration_path(resource_name), :confirm => "Are you sure?", :method => :delete %>.
+ </p>
+</div>
-<p>Unhappy? <%= link_to "Cancel my account", registration_path(resource_name), :confirm => "Are you sure?", :method => :delete %>.</p>
-<%= link_to "Back", :back %>
View
8 app/views/devise/registrations/new.html.erb
@@ -7,7 +7,11 @@
<%= f.input :avatar, :as => :file %>
<%= f.input :password, :as => :password %>
<%= f.input :password_confirmation, :as => :password %>
- <%= f.button :submit, "Sign in" %>
+ <div class="submit">
+ <%= f.button :submit, "Sign in" %>
+ </div>
<% end %>
-<%= render :partial => "devise/shared/links" %>
+<div id="devise_links">
+ Already registered? <%= link_to "Sign in", new_session_path(resource_name) %>
+</div>
View
11 app/views/devise/sessions/new.html.erb
@@ -8,7 +8,14 @@
<%= f.input :remember_me, :as => :boolean %>
<% end -%>
- <div><%= f.button :submit, "Sign in" %></div>
+ <%= link_to "Forgot your password?", new_password_path(resource_name), :class => "forgot_password" %>
+
+ <div class="submit">
+ <%= f.button :submit, "Sign in" %>
+ </div>
+
<% end %>
-<%= render :partial => "devise/shared/links" %>
+<div id="devise_links">
+ Not registered yet? <%= link_to "Sign up", new_registration_path(resource_name) %>
+</div>
View
29 app/views/layouts/devise.html.erb
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+ <%= title_tag %>
+ <%= stylesheet_link_tag "devise" %>
+ <%= javascript_include_tag "application" %>
+ <%= csrf_meta_tags %>
+</head>
+
+<body>
+
+ <div id="login">
+
+ <%= flash_messages %>
+
+ <div id="header" class="clearfix">
+ <div id="app_name"><%= AppConfig.name %></div>
+ </div>
+
+ <%= yield %>
+
+ <div id="footer"><%= AppConfig.name %> &copy; 2011</div>
+
+ </div>
+
+</body>
+
+</html>
View
8 app/views/public_todo_lists/index.html.erb
@@ -1,5 +1,11 @@
<% title "Public todo lists", :show => false %>
<div id="todo_lists">
- <%= render :partial => "todo_list", :collection => @public_todo_lists %>
+ <% unless @public_todo_lists.empty? %>
+ <%= render :partial => "todo_list", :collection => @public_todo_lists %>
+ <% else %>
+ <p class="empty">
+ No public lists were created.
+ </p>
+ <% end %>
</div>
View
8 app/views/todo_lists/index.html.erb
@@ -1,5 +1,11 @@
<% title "My todo lists", :show => false %>
<div id="todo_lists">
- <%= render @todo_lists %>
+ <% unless @todo_lists.empty? %>
+ <%= render @todo_lists %>
+ <% else %>
+ <p class="empty">
+ You haven't created any lists yet. Why don't you go ahead and <%= link_to "create a new one", new_todo_list_path %>?
+ </p>
+ <% end %>
</div>
View
8 app/views/watched_lists/index.html.erb
@@ -1,5 +1,11 @@
<% title "Watched lists", :show => false %>
<div id="todo_lists">
- <%= render :partial => "todo_list", :collection => @watched_lists %>
+ <% unless @watched_lists.empty? %>
+ <%= render :partial => "todo_list", :collection => @watched_lists %>
+ <% else %>
+ <p class="empty">
+ You aren't watching any public list. Let's <%= link_to "find some", public_todo_lists_path %> for you!
+ </p>
+ <% end %>
</div>
View
6 config/application.rb
@@ -52,5 +52,11 @@ class Application < Rails::Application
config.assets.version = '1.0'
config.assets.paths << Rails.root.join("lib", "assets")
+
+ config.to_prepare {
+ Devise::RegistrationsController.layout proc { |controller| user_signed_in? ? "application" : "devise" }
+ Devise::SessionsController.layout "devise"
+ Devise::PasswordsController.layout "devise"
+ }
end
end
View
40 spec/requests/todo_lists_request_spec.rb
@@ -18,7 +18,7 @@
fill_in "Name", :with => ""
click_button "Create Todo list"
all("div#tasks > div.task_field input[type=text]").should have(TodoList::NUMBER_OF_TASK_FIELDS).items
- fill_in(find("div#tasks > div.task_field:nth-child(1) input")[:id], :with => "Can't find a good name to my todo list")
+ fill_in(find(:task_field, 1)[:id], :with => "Can't find a good name to my todo list")
click_button "Create Todo list"
all("div#tasks > div.task_field input[type=text]").should have(TodoList::NUMBER_OF_TASK_FIELDS).items
end
@@ -26,7 +26,7 @@
scenario "can create a todo list with valid attributes" do
visit new_todo_list_path
fill_in "Name", :with => "Christmas wish list"
- fill_in(find("div#tasks > div.task_field:nth-child(1) input")[:id], :with => "Kindle")
+ fill_in(find(:task_field, 1)[:id], :with => "Kindle")
click_button "Create Todo list"
current_path.should eq todo_lists_path
within(".flash_message") { page.should have_content "Todo list was successfully created." }
@@ -38,22 +38,24 @@
visit new_todo_list_path
fill_in "Name", :with => "Things to learn"
all("div#tasks > div.task_field").should have(4).items
- fill_in(find("div#tasks > div.task_field:nth-child(1) input")[:id], :with => "Node.js")
- fill_in(find("div#tasks > div.task_field:nth-child(2) input")[:id], :with => "EventMachine")
- fill_in(find("div#tasks > div.task_field:nth-child(3) input")[:id], :with => "SVG")
- fill_in(find("div#tasks > div.task_field:nth-child(4) input")[:id], :with => "NoSQL")
+ fill_in(find(:task_field, 1)[:id], :with => "Node.js")
+ fill_in(find(:task_field, 2)[:id], :with => "EventMachine")
+ fill_in(find(:task_field, 3)[:id], :with => "SVG")
+ fill_in(find(:task_field, 4)[:id], :with => "NoSQL")
click_link "Add task"
all("div#tasks > div.task_field").should have(5).items
- fill_in(find("div#tasks > div.task_field:nth-child(5) input")[:id], :with => "Titanium Mobile")
+ fill_in(find(:task_field, 5)[:id], :with => "Titanium Mobile")
click_button "Create Todo list"
current_path.should eq todo_lists_path
within(".flash_message") { page.should have_content "Todo list was successfully created." }
within("div#todo_lists") { page.should have_content "Things to learn" }
- within("ul.tasks") { page.should have_content "Node.js" }
- within("ul.tasks") { page.should have_content "EventMachine" }
- within("ul.tasks") { page.should have_content "SVG" }
- within("ul.tasks") { page.should have_content "NoSQL" }
- within("ul.tasks") { page.should have_content "Titanium Mobile" }
+ within("ul.tasks") do
+ page.should have_content "Node.js"
+ page.should have_content "EventMachine"
+ page.should have_content "SVG"
+ page.should have_content "NoSQL"
+ page.should have_content "Titanium Mobile"
+ end
end
scenario "cannot create a todo list without name" do
@@ -69,13 +71,15 @@
visit edit_todo_list_path(todo_list)
all("div#tasks > div.task_field").should have(2).items
fill_in "Name", :with => "Things I MUST to learn"
- fill_in(find("div#tasks > div.task_field:nth-child(1) input")[:id], :with => "Backbone.js")
+ fill_in(find(:task_field, 1)[:id], :with => "Backbone.js")
click_button "Update Todo list"
current_path.should eq todo_lists_path
within(".flash_message") { page.should have_content "Todo list was successfully updated." }
within("div#todo_lists") { page.should have_content "Things I MUST to learn" }
- within("ul.tasks") { page.should have_content "Backbone.js" }
- within("ul.tasks") { page.should have_content "SproutCore" }
+ within("ul.tasks") do
+ page.should have_content "Backbone.js"
+ page.should have_content "SproutCore"
+ end
end
scenario "can remove items from a todo list", :js => true do
@@ -85,8 +89,10 @@
find("div#tasks > div.task_field:nth-child(2) a.remove_child").click
click_button "Update Todo list"
all("ul.tasks").should have(1).item
- within("ul.tasks") { page.should have_content "Cool item" }
- within("ul.tasks") { page.should_not have_content "Not so cool" }
+ within("ul.tasks") do
+ page.should have_content "Cool item"
+ page.should_not have_content "Not so cool"
+ end
end
scenario "can remove a todo list", :js => true do
View
1  spec/spec_helper.rb
@@ -18,6 +18,7 @@
config.use_transactional_fixtures = false
config.infer_base_class_for_anonymous_controllers = false
config.include AuthMacros
+ config.include CapybaraSelectors
end
end
View
7 spec/support/capybara_selectors.rb
@@ -0,0 +1,7 @@
+module CapybaraSelectors
+
+ Capybara.add_selector(:task_field) do
+ xpath { |num| XPath.css("div#tasks > div.task_field:nth-child(#{num}) input") }
+ end
+
+end

No commit comments for this range

Something went wrong with that request. Please try again.