LoginSignup
3
3

More than 5 years have passed since last update.

Ruby on Railsチュートリアル学習メモ

Posted at

概要

  • ドットインストール:Ruby on Rails4入門
  • 基礎文法の学習
  • Ruby Webアプリケーションフレームワーク
  • 公式サイト http://rubyonrails.org/
  • キーワード
    • Ruby
    • HTML/CSS/JavaScript/JQuery
    • SQLite/ActiveRecord

DRY/CoC/MVC

  • DRY
    Don't Repeat Yourself
  • Coc
    Convention over Configuration
  • MVC
    Model, View, Controller

test rails app

terminal
$rails new myapp

.....

$tree
.
├── Gemfile
├── Gemfile.lock
├── README.rdoc
├── Rakefile
├── app
│   ├── assets
│   │   ├── images
│   │   ├── javascripts
│   │   │   └── application.js
│   │   └── stylesheets
│   │       └── application.css
│   ├── controllers
│   │   ├── application_controller.rb
│   │   └── concerns
│   ├── helpers
│   │   └── application_helper.rb
│   ├── mailers
│   ├── models
│   │   └── concerns
│   └── views
│       └── layouts
│           └── application.html.erb
├── bin
│   ├── bundle
│   ├── rails
│   ├── rake
│   ├── setup
│   └── spring
├── config
│   ├── application.rb
│   ├── boot.rb
│   ├── database.yml
│   ├── environment.rb
│   ├── environments
│   │   ├── development.rb
│   │   ├── production.rb
│   │   └── test.rb
│   ├── initializers
│   │   ├── assets.rb
│   │   ├── backtrace_silencers.rb
│   │   ├── cookies_serializer.rb
│   │   ├── filter_parameter_logging.rb
│   │   ├── inflections.rb
│   │   ├── mime_types.rb
│   │   ├── session_store.rb
│   │   └── wrap_parameters.rb
│   ├── locales
│   │   └── en.yml
│   ├── routes.rb
│   └── secrets.yml
├── config.ru
├── db
│   └── seeds.rb
├── lib
│   ├── assets
│   └── tasks
├── log
├── public
│   ├── 404.html
│   ├── 422.html
│   ├── 500.html
│   ├── favicon.ico
│   └── robots.txt
├── test
│   ├── controllers
│   ├── fixtures
│   ├── helpers
│   ├── integration
│   ├── mailers
│   ├── models
│   └── test_helper.rb
├── tmp
│   └── cache
│       └── assets
└── vendor
    └── assets
        ├── javascripts
        └── stylesheets

38 directories, 40 files

Scaffold

terminal
$rails generate scaffold User name:string score:integer

Running via Spring preloader in process 32874
      invoke  active_record
      create    db/migrate/20160417055926_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
      invoke  resource_route
       route    resources :users
      invoke  scaffold_controller
      create    app/controllers/users_controller.rb
      invoke    erb
      create      app/views/users
      create      app/views/users/index.html.erb
      create      app/views/users/edit.html.erb
      create      app/views/users/show.html.erb
      create      app/views/users/new.html.erb
      create      app/views/users/_form.html.erb
      invoke    test_unit
      create      test/controllers/users_controller_test.rb
      invoke    helper
      create      app/helpers/users_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/users/index.json.jbuilder
      create      app/views/users/show.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/users.coffee
      invoke    scss
      create      app/assets/stylesheets/users.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.scss
terminal
$rake db:migrate

== 20160417055926 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0014s
== 20160417055926 CreateUsers: migrated (0.0014s) =============================

org rails app

generate model

terminal
$rails new taskapp
terminal
$rails generate model Project title:string

Running via Spring preloader in process 34285
      invoke  active_record
      create    db/migrate/20160417061446_create_projects.rb
      create    app/models/project.rb
      invoke    test_unit
      create      test/models/project_test.rb
      create      test/fixtures/projects.yml
terminal
$rake db:migrate

== 20160417061446 CreateProjects: migrating ===================================
-- create_table(:projects)
   -> 0.0021s
== 20160417061446 CreateProjects: migrated (0.0023s) ==========================

rails console

terminal
$rails console

Running via Spring preloader in process 34938
Loading development environment (Rails 4.2.5.1)
irb(main):001:0> p = Project.new(title: "p1")
=> #<Project id: nil, title: "p1", created_at: nil, updated_at: nil>

irb(main):002:0> p.save
   (0.2ms)  begin transaction
  SQL (0.9ms)  INSERT INTO "projects" ("title", "created_at", "updated_at") VALUES (?, ?, ?)  [["title", "p1"], ["created_at", "2016-04-17 06:23:24.877303"], ["updated_at", "2016-04-17 06:23:24.877303"]]
   (0.8ms)  commit transaction
=> true

irb(main):003:0> p
=> #<Project id: 1, title: "p1", created_at: "2016-04-17 06:23:24", updated_at: "2016-04-17 06:23:24">

irb(main):004:0> Project.create(title: "p2")
   (0.1ms)  begin transaction
  SQL (1.1ms)  INSERT INTO "projects" ("title", "created_at", "updated_at") VALUES (?, ?, ?)  [["title", "p2"], ["created_at", "2016-04-17 06:24:41.297234"], ["updated_at", "2016-04-17 06:24:41.297234"]]
   (0.7ms)  commit transaction
=> #<Project id: 2, title: "p2", created_at: "2016-04-17 06:24:41", updated_at: "2016-04-17 06:24:41">

irb(main):005:0> Project.all
  Project Load (0.2ms)  SELECT "projects".* FROM "projects"
=> #<ActiveRecord::Relation [#<Project id: 1, title: "p1", created_at: "2016-04-17 06:23:24", updated_at: "2016-04-17 06:23:24">, #<Project id: 2, title: "p2", created_at: "2016-04-17 06:24:41", updated_at: "2016-04-17 06:24:41">]>

irb(main):006:0> quit

rails db

terminal
$rails db

SQLite version 3.8.10.2 2015-05-20 18:17:19
Enter ".help" for usage hints.

sqlite> .schema
CREATE TABLE "schema_migrations" ("version" varchar NOT NULL);
CREATE UNIQUE INDEX "unique_schema_migrations" ON "schema_migrations" ("version");
CREATE TABLE "projects" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "title" varchar, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL);

sqlite> select * from projects;
1|p1|2016-04-17 06:23:24.877303|2016-04-17 06:23:24.877303
2|p2|2016-04-17 06:24:41.297234|2016-04-17 06:24:41.297234

sqlite> .exit

generate controller

terminal
$rails g controller Projects
Running via Spring preloader in process 35674
      create  app/controllers/projects_controller.rb
      invoke  erb
      create    app/views/projects
      invoke  test_unit
      create    test/controllers/projects_controller_test.rb
      invoke  helper
      create    app/helpers/projects_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/projects.coffee
      invoke    scss
      create      app/assets/stylesheets/projects.scss

add routes

taskapp/config/routes.rb

 Rails.application.routes.draw do
+  resources :projects
+  root 'projects#index'
+  
   # The priority is based upon order of creation: first created -> highest priority.
   # See how all your routes lay out with "rake routes".
terminal
$rake routes

      Prefix Verb   URI Pattern                  Controller#Action
    projects GET    /projects(.:format)          projects#index
             POST   /projects(.:format)          projects#create
 new_project GET    /projects/new(.:format)      projects#new
edit_project GET    /projects/:id/edit(.:format) projects#edit
     project GET    /projects/:id(.:format)      projects#show
             PATCH  /projects/:id(.:format)      projects#update
             PUT    /projects/:id(.:format)      projects#update
             DELETE /projects/:id(.:format)      projects#destroy
        root GET    /                            projects#index

mod common template

taskapp/app/views/layouts/application.html.erb

 </head>
 <body>

+<%= image_tag "logo.png" %>
+
 <%= yield %>

+<%= link_to "Home", projects_path %>
+
 </body>
 </html>

add action (index, show, new, create, edit, update, destroy, before_action)

  • controller
taskapp/app/controllers/projects_controller.rb

+ class ProjectsController < ApplicationController
+    before_action :set_project, only: [:show, :edit, :update, :destroy];
+    
+    def index
+        @projects = Project.all;
+    end
+
+    def show
+        #@project = Project.find(params[:id]);
+    end
+
+    def new
+        @project = Project.new();
+    end
+
+    def create
+        @project = Project.new(project_params);
+        if @project.save();
+            redirect_to(projects_path);
+        else
+            render 'new';
+        end
+    end
+
+    def edit
+    end
+
+    def update
+        if @project.update(project_params)
+            redirect_to(projects_path);
+        else
+            render 'edit';
+        end
+    end
+
+    def destroy
+        @project.destroy;
+        redirect_to(projects_path);
+    end
+
+    private
+        def project_params
+            # params[:project].permit(:title);
+            params.require(:project).permit(:title);
+        end
+
+        def set_project
+            @project = Project.find(params.require(:id));
+        end
+ end
  • view - partial template
taskapp/app/views/projects/_form.html.erb
+<%= form_for @project do |f| %>
+<p>
+    <%= f.label :title %><br>
+    <%= f.text_field :title %>
+    <% if @project.errors.any? %>
+        <!-- <%= @project.errors.inspect %> -->
+        <%= @project.errors.messages[:title][0] %>
+    <% end %>
+</p>
+
+<p>
+    <%= f.submit %>
+</p>
+
+<% end %>
  • view - template
taskapp/app/views/projects/index.html.erb
+ <ul>
+     <% @projects.each do | project | %>
+     <li>
+        <%= link_to project.title, project_path(project.id) %>
+        <%= link_to "[Edit]", edit_project_path(project.id) %>
+        <%= link_to "[Delete]", project_path(project.id), method: :delete, data: { confirm: "are you sure?" } %>
+     </li>
+     <% end %>
+</ul>
+
+<p>
+<%= link_to "add new", new_project_path %>
+</p>
taskapp/app/views/projects/edit.html.erb
+<h1>Edit</h1>
+
+<%= render 'form' %>
taskapp/app/views/projects/new.html.erb
+<h1>Add New</h1>
+
+<%= render 'form' %>
taskapp/app/views/projects/show.html.erb
+<h1><%= @project.title %></h1>

generate model references

terminal
$rails g model Task title done:boolean project:references

Running via Spring preloader in process 68437
      invoke  active_record
      create    db/migrate/20160418062553_create_tasks.rb
      create    app/models/task.rb
      invoke    test_unit
      create      test/models/task_test.rb
      create      test/fixtures/tasks.yml
terminal
$rails g controller Tasks
Running via Spring preloader in process 68768
      create  app/controllers/tasks_controller.rb
      invoke  erb
      create    app/views/tasks
      invoke  test_unit
      create    test/controllers/tasks_controller_test.rb
      invoke  helper
      create    app/helpers/tasks_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/tasks.coffee
      invoke    scss
      create      app/assets/stylesheets/tasks.scss

add action (index, show, new, create, edit, update, destroy, before_action)

  • controller
taskapp/app/controllers/tasks_controller.rb
+class TasksController < ApplicationController
+    def create
+        @project = Project.find(params.require(:project_id));
+        @task = @project.tasks.create(task_params);
+        redirect_to project_path(@project.id);
+    end
+
+    def destroy
+        @task = Task.find(params.require(:id));
+        @task.destroy;
+        redirect_to project_path(params.require(:project_id));
+    end
+
+    def toggle
+        render nothing: true;
+        
+        @task = Task.find(params[:id]);
+        @task.done = !@task.done;
+        @task.save;
+    end
+
+    private
+        def task_params
+            params.require(:task).permit(:title);
+        end
+end
taskapp/config/routes.rb
 Rails.application.routes.draw do
-  resources :projects
+  resources :projects do
+    resources :tasks, only: [:create, :destroy]
+  end
+
   root 'projects#index'
-  
+  post '/projects/:project_id/tasks/:id/toggle' => 'tasks#toggle'
+
   # The priority is based upon order of creation: first created -> highest priority.
   # See how all your routes lay out with "rake routes".


  • model
taskapp/app/models/project.rb
 class Project < ActiveRecord::Base
+    has_many :tasks;
     # validates :title, presence: true;
     validates :title,
         presence: { message: "入力してください" },
taskapp/app/models/task.rb
+class Task < ActiveRecord::Base
+  belongs_to :project;
+  validates :title, presence: true;
+  scope :unfinished, -> { where(done: false) }
+end
  • view
taskapp/app/views/projects/index.html.erb

  <ul>
     <% @projects.each do | project | %>
     <li>
-        <%= link_to project.title, project_path(project.id) %>
+        <%= link_to project.title, project_path(project.id) %>(<%= project.tasks.unfinished.count %>/<%= project.tasks.count %>)
         <%= link_to "[Edit]", edit_project_path(project.id) %>
         <%= link_to "[Delete]", project_path(project.id), method: :delete, data: { confirm: "are you sure?" } %>
     </li>
taskapp/app/views/projects/show.html.erb

+<ul>
+    <% @project.tasks.each do |task| %>
+    <li>
+        <%= check_box_tag '', '', task.done, {'data-id' => task.id, 'data-project_id' => task.proje
ct_id } %>
+        <%= task.title %>
+        <%= link_to "[Delete]", project_task_path(task.project_id, task.id), method: :delete, data:
 { confirm: "are you sure?" } %>
+    </li>
+    <% end %>
+
+    <li>
+        <%= form_for [@project, @project.tasks.build] do |f| %>
+            <%= f.text_field :title %>
+            <%= f.submit %>
+        <% end %>
+    </li>
+</ul>
+<script>
+    $(function(){
+        $("input[type=checkbox]").click(function() {
+            $.post('/projects/'+$(this).data('project_id')+'/tasks/'+$(this).data('id')+'/toggle');
+        });
+    });
+</script>
3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3