Lesson2


Lesson1の復習

使ったコマンド

$ rails new プロジェクト名
$ rails generate scaffold テーブル名 カラム:データ型
$ rake db:migrate
$ rails console #または rails c
$ rails server #または rails 
$ rails -h                      #railsコマンドのヘルプ
$ rails generate -h             #rails generateコマンドのヘルプ
$ rails generate scaffold -h    #rails generate scaffoldコマンドのヘルプ
$ rake -T                       #rakeで実行できるタスクの一覧
$ rake routes

今日はURLとリレーションのお話

例えば、URLをこんな風に

http://example.com/animes/1/characters

(animes/1の”1”の部分を”TIGER & BUNNY”とか名前にしたいという方には、こちら つ gem friendly_id

リレーションはこんな風に

アニメ 1 : 多 キャラクター

(とあるキャラが他のアニメにも出てることは考えないでおきます。)


URLとリレーションの設定は「それぞれ個々に設定するもの」と覚えておきましょう。


URLの設定

http://example.com/animes/1/characters の場合

resources :animes do
  resources :characters
end

そうしてから、rake routesコマンドでURLの出来映えを確認しましょう。


リレーションの設定

アニメ 1 : 多 キャラクター の場合

anime.rb

class Anime
  has_many :characters #追記
end

character.rb

class Character
  belongs_to :anime #追記
end

リンクの変更

ここまできたら、具体的に登録ページを作っていきます。

まずは、リンクの設定方法の確認。

rake routesコマンドを実行してみると

new_anime GET    /animes/new(.:format)   animes#new

“GET”のうしろから”(.:format)”の間が、出来上がりのURL。

html.erbには、

app/views/animes/index.html.erb

<%= link_to 'New Anime', new_anime_path %>

という記述があり、”new_anime”というのを”_path”につなぐだけ。

簡単!


では、例題。

rake routesで確認。

new_anime_character GET    /animes/:anime_id/characters/new(.:format)   characters#new

app/views/animes/show.html.erb

<%= link_to 'New Character', new_anime_character_path(@anime) %>

“_path”の後ろには、URLに入る:anime_idのネタとなるものを渡してあげないといけない。


ページでのリレーションの保持

方法その1:URLの階層構造を使って、関係先のidをもらう

まず、rake routesで new_anime_charactor GET /animes/:anime_id/charactors/new(.:format) charactors#new があることを確認しましょう。

そして、以下の編集をします。

app/controllers/characters_controller.rb

def new
  @character = Character.new
  @anime     = Anime.find(params[:anime_id]) #追記
  ・・・
end

def create
  @anime     = Anime.find(params[:anime_id]) #追記
  @character = @anime.characters.new(params[:character]) #編集
  ・・・
end

params[:anime_id]と書くと、URLの/:anime_idを勝手に参照してくれる。

便利!

app/views/characters/_form.html.erb

<%= form_for([@anime, @character]) do |f| %> <!--編集-->
  ・・・
  <div class="field">
    <%= f.label :anime_id %><br />
    <%= @anime.name %>                      <!--編集(表示するだけにする)-->
  </div>
  ・・・
<% end %>

方法その2:セレクトボックスで関係先のidをもらう

まず、rake routesで new_charactor GET /charactors/new(.:format) charactors#new があることを確認しましょう。

そして、以下の編集をします。

app/controllers/characters_controller.rb

def new
  @character = Character.new
  @animes   = Anime.all #追記
  ・・・
end

def create
  @character          = Character.new(params[:character])
  @character.anime_id = params[:character][:anime_id] #追記
  ・・・
end

params[:character][:anime_id]と書くと、viewから送られて来た配列をうまい具合に拾ってくれる。

便利!

app/views/characters/_form.html.erb

<%= form_for(@character) do |f| %>
  ・・・
  <div class="field">
    <%= f.label :anime_id %><br />
    <%= f.select :anime_id, @animes.map{|a| [a.name, a.id]} %> <!--編集(セレクトボックスに変更)-->
  </div>
  ・・・
<% end %>

ここまでできること

これだけは駆使してできると思います。がんばってください!


おまけ

$ rails generate model テーブル名 カラム:データ型
$ rake db:migrate
$ rails generate controller コントローラー名s #コントローラー名は複数形で書くこと!

Lesson2はここまでです。おつかれさまでした

This work is licensed under a Creative Commons Attribution-Share Alike 3.0 License

produced by Minami.rb