27.02.2013 Views

Rails%203%20In%20Action

Rails%203%20In%20Action

Rails%203%20In%20Action

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

68 CHAPTER 3 Developing a real Rails application<br />

}<br />

},<br />

"controller" => "projects"<br />

TIP If you’d like to inspect the params hash at any point in time, you can<br />

put p params in any action and then run the action either by accessing it<br />

through rails server or by running a scenario that will run an action<br />

containing this line. This outputs to the console the params hash and is<br />

equivalent to doing puts params.inspect.<br />

All the hashes nested inside this hash are also HashWithIndifferentAccess hashes. If<br />

you want to get the name key from the project hash here, you can use either { :name =><br />

"TextMate 2" }[:name], as in a normal Hash object, or { :name => "TextMate 2"<br />

}['name']; you may use either the String or the Symbol version—it doesn’t matter.<br />

The first key in the params hash, commit, comes from the Submit button, which<br />

has the value Create Project. This is accessible as params[:commit]. The second key,<br />

action, is one of two parameters always available, the other being controller. These<br />

represent exactly what their names imply: the controller and action of the request,<br />

accessible as params[:controller] and params[:action] respectively. The final key,<br />

project, is, as mentioned before, a HashWithIndifferentAccess. It contains the<br />

fields from your form and is accessible via params[:project]. To access the name field,<br />

use params[:project][:name], which calls the [] method on params to get the value<br />

of the :project key and then, on the result, calls [] again, this time with the :name<br />

key to get the name of the project passed in.<br />

When new receives this HashWithIndifferentAccess, it generates a new Project<br />

object with the attributes based on the parameters passed in. The Project object will<br />

have a name attribute set to the value from params[:project][:name].<br />

You call @project.save to save your new Project object into the projects table.<br />

The flash method in your create action is a way of passing messages to the next<br />

request, and it’s also a HashWithIndifferentAccess. These messages are stored in the<br />

session and are cleared at the completion of the next request. Here you set the<br />

:notice key to be Project has been created. to inform the user what has happened. This<br />

message is displayed later, as is required by the final step in your feature.<br />

The redirect_to method takes either an object, as in the create action, or a path<br />

to redirect to as a string. If an object is given, Rails inspects that object to determine<br />

what route it should go to, in this case, project_path(@project) because the object<br />

has now been saved to the database. This method generates the path of something<br />

such as /projects/:id, where :id is the record id attribute assigned by your database<br />

system. The redirect_to method tells the browser to begin making a new request to<br />

that path and sends back an empty response body; the HTTP status code will be a 302<br />

Redirected to /projects/1, which is the currently nonexistent show action.<br />

Upon running rake cucumber:ok again, you are told that your app doesn’t know<br />

about a show action:<br />

And I press "Create Project"<br />

The action 'show' could not be found for ProjectsController

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!