module Orchestrate::Rails::Tutorial::TheCreateAction
Adding the create action¶ ↑
We'll now implement the ability to add new films to the collection.
Updating the films controller.¶ ↑
In this case we'll add two new actions to the controller:
-
new
to receive the form data. -
create
for saving to the films collection.
Update <rails-root>/app/controllers/films_controller.rb
to add the new
and create
actions, along with the
private methods attributes and
generate_primary_key.
The rails application is responsible for setting the value of the id attribute when updating the collection with newly created data. In this example, we'll use generate_primary_key to derive the primary_key from the film title, subsequently using the value to set the id attribute.
class FilmsController < ApplicationController def index @films = Film.all end def show @film = Film.find params[:id] @comments = @film.comments @sequels = @film.sequels @spawn_of_sequels = @film.spawn_of_sequels end def new @film = Film.new end def create @film = Film.create! attributes redirect_to :action => 'show', :id => @film.id end private # "The Godfather:Part IV" --> "the_godfather_part_iv" def generate_primary_key params[:film][:title].downcase.tr(': ', '_') end def attributes params[:film].merge(:id => generate_primary_key) end end
Creating the view for the new action.¶ ↑
Let's add a form to enter a new film into the collection.
Reminder: HAML is quite particular about indentation, so take care to keep the code aligned properly when pasting into your editor.
Create <rails-root>/app/views/films/new.html.haml
as
shown:
.row = form_for(@film, url: { action: 'create'}, html: { class: "form-signin"}) do |f| %h2="Add a new movie!" = f.text_field :title, class: "form-control text-top", placeholder: "Title" = f.text_field :year, class: "form-control text-middle", placeholder: "Year" = f.text_field :rated, class: "form-control text-middle", placeholder: "Rated" = f.text_field :genre, class: "form-control text-middle", placeholder: "Genre" = f.text_field :director, class: "form-control text-middle", placeholder: "Director" = f.text_field :writer, class: "form-control text-middle", placeholder: "Writer" = f.text_field :actors, class: "form-control text-middle", placeholder: "Actors" = f.text_field :type, class: "form-control text-bottom", placeholder: "Type" = f.submit "Add my movie", class: "btn btn-lg btn-primary btn-block"
Adding a form-specific stylesheet¶ ↑
We'll need to add a new stylesheet for the form we just created.
Create
<rails-root>/app/assets/stylesheets/form-signin.css
as
shown:
.form-signin { max-width: 550px; padding: 15px; margin: 0 auto; } .form-signin .form-signin-heading, .form-signin .checkbox { margin-bottom: 10px; } .form-signin .checkbox { font-weight: normal; } .form-signin .form-control { position: relative; font-size: 16px; height: auto; padding: 10px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .form-signin .form-control:focus { z-index: 2; } .form-signin input.text-top { margin-bottom: -1px; border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .form-signin input.text-middle { margin-bottom: -1px; border-top-left-radius: 0; border-top-right-radius: 0; border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .form-signin input.text-bottom { margin-bottom: 10px; border-top-left-radius: 0; border-top-right-radius: 0; } .form-signin .input-group { width: 100%; } .form-signin .input-group-addon { background-color: #bbb; }
Check it out¶ ↑
Navigate to films#new and add a new movie!