使ったコマンド
$ 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をこんな風に
http://example.com/animes/1/characters
(animes/1の”1”の部分を”TIGER & BUNNY”とか名前にしたいという方には、こちら つ gem friendly_id)
リレーションはこんな風に
アニメ
1 : 多 キャラクター
(とあるキャラが他のアニメにも出てることは考えないでおきます。)
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 %>
.map
はRubyのEnumerable#mapというメソッドです。これだけは駆使してできると思います。がんばってください!
$ rails generate model テーブル名 カラム:データ型
$ rake db:migrate
$ rails generate controller コントローラー名s #コントローラー名は複数形で書くこと!
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 License
produced by Minami.rb