Girls_I_Loved

a comprehensive Rails 3.2 CRUD example

Stars
14

Rails

001 Rails

Rails Rails

  • DRY DIY

  • Convention Over Configuration

  • REST HTTP

MVCMVC Model View Controller

  • --

  • --

  • --

MVC ** HTML PHP ** 200 OGC 90...

Rails ...

Rails

RVMRVM Ruby Ruby Ruby Gems RVM RVM Gemset

Rails 3.2.3 Ruby 1.9.3

rvm install 1.9.3 (rvm use --default 1.9.3 )

Ruby 1.9.2+ RubyGemsMac/Unix Rails

gem install rails -v 3.2.3

...

** Rails**

Rails Gems Gem Gem Rails Gem Ruby bundle building native ... GFW RubyGems

...


Rails

Rails

girls_I_loved

rails

rails new girls_I_loved

DONT PANIC Rails

** rails help rails

cd girls_I_loved

([path-to-your-app/girls_I_loved] $)

rails server Ruby WEBrick

http://0.0.0.0:3000/ http://localhost:3000/ http://127.0.0.1:3000/

Rails Ruby

About your applications environment Rails

Environment development

Rails development, test, production development cached

sqlite3

Database adapter sqlite3

** ctrl + C rails s rails server

Rails

scaffold Rails Rails craftman

``

rails generate scaffold girl name:string number:integer





girl name:string number:integer

girl name number

attribute Rails Migration

Rails schemaTimestamp

db/migrate/[YYYYMMDDHHMMSS]_create_girls.rb

db/migrate/

class CreateGirls < ActiveRecord::Migration
  def change
    create_table :girls do |t|
      t.string :name
      t.integer :number

      t.timestamps
    end
  end
end

ActiveRecord::Migration change

create_table :girls do |t|

girls t.timestamps created_at updated_at Rails rollback change up down

OK! rake db:migrate

==  CreateGirls: migrating ====================================================
-- create_table(:girls)
   -> 0.0021s
==  CreateGirls: migrated (0.0022s) ===========================================

rake db:migrate up Rails db/development.sqlite3 girls rake db:migrate

Rails db/schema.rb

ActiveRecord::Schema.define(:version => YYYYMMDDHHMMSS) do

  create_table "girls", :force => true do |t|
    t.string   "name"
    t.integer  "number"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

end

YYYYMMDDHHMMSS

db/migrate/[YYYYMMDDHHMMSS]_create_girls.rb

rake db:schema:load

** rake db:rollback down

rails s http://localhost:3000/girls/

New Girl

GirlsController new action

app/views/girls/new.html.erb

<h1>New girl</h1>

<%= render 'form' %>

<%= link_to 'Back', girls_path %>

ERB ERB Embedded RuBy Ruby HTML

<%= %> <% %>

<% hot=true %> 

... ERB

h1 render 'form' render render partial

partial partial DRY

link_to a Back href girls_path /girls

_form.html.erb

<%= form_for(@girl) do |f| %>
  ...
<% end %>

form_for helperform_for @gril @girl

GirlsController new

def new
  @girl = Girl.new

  respond_to do |format|
    format.html # new.html.erb
    format.json { render json: @girl }
  end
end

Girl new @girl @girl Rails

respond_to HTML JSON format.html new.html.erb format.json @girl JSON

rails generate scaffold girl name:string number:integer

_form.html.erb <%= form_for(@girl) do |f| %> <% end %>

<% if @girl.errors.any? %>
  <div id="error_explanation">
    <h2><%= pluralize(@girl.errors.count, "error") %> prohibited this girl from being saved:</h2>

    <ul>
    <% @girl.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  </div>
<% end %>

@girl @girl validation if

_form.html.erb

<div class="field">
  <%= f.label :name %><br />
  <%= f.text_field :name %>
</div>
<div class="field">
  <%= f.label :number %><br />
  <%= f.number_field :number %>
</div>
<div class="actions">
  <%= f.submit %>
</div>

D

submit create

def create
  @girl = Girl.new(params[:girl])

  respond_to do |format|
    if @girl.save
      format.html { redirect_to @girl, notice: 'Girl was successfully created.' }
      format.json { render json: @girl, status: :created, location: @girl }
    else
      format.html { render action: "new" }
      format.json { render json: @girl.errors, status: :unprocessable_entity }
    end
  end
end

new Girl.new params[:girl] params parameters (hash) params[:girl] new Rails

respond_to if-else if @girl.save record

redirect_to @girl redirect_to @girl girl_path Girl show notice: flash flash request

not valid@girl.save nil false render new new new Ruby-china

(validation) @girl

Girl app/models/girl.rb

class Girl < ActiveRecord::Base
  attr_accessible :name, :number
  validates :name, :presence => true
  validates :number, :presence => true, 
                     :uniqueness => true, 
                     :numericality => { :greater_than => 1 }
end

validates http://localhost:3000/girls New Girl Create Girl

name"#{}"

 NameError: undefined local variable or method `' for main:Object

greater_than -1

It works!

2 **1 **

http://localhost:3000/girls/N

N Girl ID show app/views/girls/show.html.erb

<p id="notice"><%= notice %></p>

<p>
  <b>Name:</b>
  <%= @girl.name %>
</p>

<p>
  <b>Number:</b>
  <%= @girl.number %>
</p>


<%= link_to 'Edit', edit_girl_path(@girl) %> |
<%= link_to 'Back', girls_path %>

notice create redirec_to notice

format.html { redirect_to @girl, notice: 'Girl was successfully created.' }

p @girl name number show

def show
  @girl = Girl.find(params[:id])

  ...
end

Girl find ID params[:id] record Girl params[:id] N

show.html.erb

<%= link_to 'Edit', edit_girl_path(@girl) %> |
<%= link_to 'Back', girls_path %>

Edit Back link_to edit_girl_path(@girl) config/routes.rb config/routes.rb

Rails

config/routes.rb

GirlsILoved::Application.routes.draw do
  resources :girls
end

Rails config/routes.rb Ruby

resources :girls

Rails resourcesroutes helpers helper edit_girl_path helper

:id ID helper girls_path girls_url http://localhost:3000/girls

request GET /girls GirlsController index GET http://localhost:3000/ /girls POST create New Girl http://localhost:3000/girls/new ->

<form accept-charset="UTF-8" action="/girls" class="new_girl" id="new_girl" method="post">

action method action method HTTP

app/views/girls/new.html.erb

<h1>New girl</h1>

<%= render 'form' %>

<%= link_to 'Back', girls_path %>

partial app/views/girls/_form.html.erb form

<%= form_for(@girl) do |f| %>

form edit

/girls/{id} GET show update

http://localhost:3000/girls Edit

new partial edit.html.erb

<h1>Editing girl</h1>

<%= render 'form' %>

<%= link_to 'Show', @girl %> |
<%= link_to 'Back', girls_path %>

new GirlsController edit

def edit
  @girl = Girl.find(params[:id])
end

show action

edit.html.erb

<h1>Editing girl</h1>

<%= render 'form' %>

<%= link_to 'Show', @girl %> |
<%= link_to 'Back', girls_path %>

link_to Show Back Show edit @girl girl_path(@girl) (/girls/:id)Rails Rails girl_path Girl

Back girls_path girls_path index

Update Girl

Update Girl show Back ( http://localhost:3000/2/edit/)

<form accept-charset="UTF-8" action="/girls/2" class="edit_girl" id="edit_girl_2" method="post"       
<div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="_method" type="hidden" value="put" />...
</div>

action /girls/2 GirlsController show method POST _method input value PUTRails POST PUT /girls/{id} PUT GirlsController update update

def update
  @girl = Girl.find(params[:id])

  respond_to do |format|
    if @girl.update_attributes(params[:girl])
      format.html { redirect_to @girl, notice: 'Girl was successfully updated.' }
      format.json { head :no_content }
    else
      format.html { render action: "edit" }
      format.json { render json: @girl.errors, status: :unprocessable_entity }
    end
  end
end

show edit find create params[:girl] update_attributes

update_attributes show edit create edit

def create
...
else
  format.html { render action: "new" }
  format.json { render json: @girl.errors, status: :unprocessable_entity }
end

...

RailsDELETE DESTROY DESTROY

http://localhost:3000/girls

Destroy

app/views/girls/index.html.erb

<h1>Listing girls</h1>

...

<% @girls.each do |girl| %>
  <tr>
    <td><%= girl.name %></td>
    <td><%= girl.number %></td>
    <td><%= link_to 'Show', girl %></td>
    <td><%= link_to 'Edit', edit_girl_path(girl) %></td>
    <td><%= link_to 'Destroy', girl, confirm: 'Are you sure?', method: :delete %></td>
  </tr>
<% end %>
</table>

<br />

<%= link_to 'New Girl', new_girl_path %>

@girls Girl |girl| girl

name number app/views/girls/show.html.erb Show, Edit, Destroy

girl /girls/{id} GirlsController show {id} ID

edit_girl_path girl edit helper /girls/{id}/edit

girl :delete /girls/{id} method: :delete Rails GirlsController destroy

def destroy
  @girl = Girl.find(params[:id])
  @girl.destroy

  respond_to do |format|
    format.html { redirect_to girls_url }
    format.json { head :no_content }
  end
end

show , edit , update @girl Girl.find(params[:id]

@girl.destroy

girls_url http://localhost:3000/girls girls_url path url URL

Rails

Rails 970

CRUD by ihower

Rails Routing from the Outside In

Demo App from Learn Rails By Example

Rails For Zombies

Badges
Extracted from project README
Related Projects