サブディレクトリの下にセットする

久しぶりすぎて何から手をつけるんだか忘れ気味なのでがんばってメモを取る。
(自分用のメモ、他の人には関係なし)

最初(失敗している)

 
mediaの下にrentaldvdを作る。

C:\Users\kenmituo\Documents\Aptana Studio\roommgr10>ruby script/generate model m
edia/rentaldvd
      create  app/models/media
      create  test/unit/media
      create  test/fixtures/media
      create  app/models/media/rentaldvd.rb
      create  test/unit/media/rentaldvd_test.rb
      create  test/fixtures/media_rentaldvds.yml
      create  db/migrate
      create  db/migrate/20110202071106_create_media_rentaldvds.rb

あれ?migrateの中身は通し番号を止めてしまったみたいだ。
 
こんな感じにしてみる。

#20110202071106_create_media_rentaldvds.rb

class CreateMediaRentaldvds < ActiveRecord::Migration
  def self.up
    create_table :media_rentaldvds do |t|
      t.column  :number,    :string
      t.column  :title,     :string
      t.column  :done,      :string
      t.column  :showtime,  :string
      t.column  :on_site,   :string
      t.column  :out_site,  :string
      t.column  :remarks,   :text
      t.column  :works,     :string
      t.column  :asin,      :string
      t.timestamps
    end
  end

  def self.down
    drop_table :media_rentaldvds
  end
end

Rakeタスクで「db:migrate」パラメータ無しで実行

>rake db:migrate 
(in C:/Users/kenmituo/Documents/Aptana Studio/roommgr10)
==  CreateMediaRentaldvds: migrating ==========================================
-- create_table(:media_rentaldvds)
   -> 0.1350s
==  CreateMediaRentaldvds: migrated (0.1350s) =================================

>

MySQLアド民でできあがりを確認

カラムが不足していることが判明、migrateのバージョンが変になっているのでカラムを追加してからRakeタスクを実行

>rake db:migrate:redo --trace

 
なんとなくいい感じになってきたので、ジェネレーターで

>script/generate controller media/rentaldvd
      exists  app/controllers/media
      exists  app/helpers/media
      create  app/views/media/rentaldvd
      create  test/functional/media
      create  test/unit/helpers/media
      create  app/controllers/media/rentaldvd_controller.rb
      create  test/functional/media/rentaldvd_controller_test.rb
      create  app/helpers/media/rentaldvd_helper.rb
      create  test/unit/helpers/media/rentaldvd_helper_test.rb
>

うんうん、できてきた。

ここでscaffoldを実行すると分けわわからなくなる(重複が発生する)のでジェネレーターでコントローラーを破棄しておく。

>script/generate scaffold media/rentaldvd
      create  app/models/media
      exists  app/controllers/media
      exists  app/helpers/media
      exists  app/views/media/rentaldvds
      create  app/views/layouts/media
      create  test/functional/media
      create  test/unit/media
      create  test/unit/helpers/media
      create  public/stylesheets/media
      create  app/views/media/rentaldvds/index.html.erb
      create  app/views/media/rentaldvds/show.html.erb
      create  app/views/media/rentaldvds/new.html.erb
      create  app/views/media/rentaldvds/edit.html.erb
      create  app/views/layouts/media/rentaldvds.html.erb
      create  public/stylesheets/scaffold.css
      create  app/controllers/media/rentaldvds_controller.rb
      create  test/functional/media/rentaldvds_controller_test.rb
      create  app/helpers/media/rentaldvds_helper.rb
      create  test/unit/helpers/media/rentaldvds_helper_test.rb
       route  map.resources :rentaldvds
  dependency  model
      exists    app/models/media
      exists    test/unit/media
      create    test/fixtures/media
      create    app/models/media/rentaldvd.rb
      create    test/unit/media/rentaldvd_test.rb
      create    test/fixtures/media_rentaldvds.yml
      exists    db/migrate
      create    db/migrate/20110203020027_create_media_rentaldvds.rb

んで、アクセスしてみたらこーなった

ActionController::RoutingError (No route matches "/media/rentaldvds" with {:meth
od=>:get}):

ActionController::RoutingError (No route matches "/media_rentaldvds" with {:meth
od=>:get}):

なんだか動かないのでscaffoldは諦める
※動かないのはサーバを間違えていたから

 
 

やり直し

ジェネレータでscaffoldする「media/rentalitem」にしてみた

>script/generate scaffold media/rentalitem
      exists  app/models/media
      exists  app/controllers/media
      exists  app/helpers/media
      create  app/views/media/rentalitems
      create  app/views/layouts/media
      create  test/functional/media
      create  test/unit/media
      create  test/unit/helpers/media
      create  public/stylesheets/media
      create  app/views/media/rentalitems/index.html.erb
      create  app/views/media/rentalitems/show.html.erb
      create  app/views/media/rentalitems/new.html.erb
      create  app/views/media/rentalitems/edit.html.erb
      create  app/views/layouts/media/rentalitems.html.erb
      create  public/stylesheets/scaffold.css
      create  app/controllers/media/rentalitems_controller.rb
      create  test/functional/media/rentalitems_controller_test.rb
      create  app/helpers/media/rentalitems_helper.rb
      create  test/unit/helpers/media/rentalitems_helper_test.rb
       route  map.resources :rentalitems
  dependency  model
      exists    app/models/media
      exists    test/unit/media
      create    test/fixtures/media
      create    app/models/media/rentalitem.rb
      create    test/unit/media/rentalitem_test.rb
      create    test/fixtures/media_rentalitems.yml
      exists    db/migrate
      create    db/migrate/20110203072515_create_media_rentalitems.rb

 
migrateをいじる

class CreateMediaRentalitems < ActiveRecord::Migration
  def self.up
    create_table :media_rentalitems do |t|
      t.column  :number,    :string
      t.column  :title,     :string
      t.column  :done,      :string
      t.column  :showtime,  :string
      t.column  :on_site,   :string
      t.column  :out_site,  :string
      t.column  :remarks,   :text
      t.column  :works,     :string
      t.column  :asin,      :string
      t.column  :webopac,   :string
      t.timestamps
    end
  end

  def self.down
    drop_table :media_rentalitems
  end
end

rakeしてみる

>rake db:migrate --trace
(in C:/Users/kenmituo/Documents/Aptana Studio/roommgr10_dash)
** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:migrate
** Invoke db:schema:dump (first_time)
** Invoke environment 
** Execute db:schema:dump

サーバ再起動してみる
 

ActiveRecord::StatementInvalid in Media/rentalitemsController#index

Mysql::Error: Table 'kenmituo.rentalitems' doesn't exist: SELECT * FROM `rentalitems` 

怒られたので編集

#models/rentalitem.rb
class Media::Rentalitem < ActiveRecord::Base
  set_table_name "media_rentalitems"
end

 
まだエラーになる

NoMethodError in Media/rentalitems#index

Showing app/views/media/rentalitems/index.html.erb where line #7 raised:

You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each

 
くそっ(眠いので言葉が汚くなる)!nilじゃねーか!!

#views/media/rentalitems/index.html.erb
<h1>Listing rentalitems</h1>

<table>
  <tr>
  </tr>
<%- unless @rentalitems.nil? %>
<% @rentalitems.each do |rentalitem| %>
  <tr>
    <td><%= link_to 'Show', rentalitem %></td>
    <td><%= link_to 'Edit', edit_rentalitem_path(rentalitem) %></td>
    <td><%= link_to 'Destroy', rentalitem, :confirm => 'Are you sure?', :method => :delete %></td>
  </tr>
<% end %>
<%- end %>
</table>

<br />

<%= link_to 'New rentalitem', new_rentalitem_path %>

nilじゃなかったら」を追加しておく
 
indexは表示された「いやっほー」newを押すとエラー

NameError in RentalitemsController#new

uninitialized constant RentalitemsController

URLが

http://127.0.0.1:3002/rentalitems/new

「media」がどっかいっちまった!
 
続きで探す・・・
 

続き

Ruby on Rail 2.3.5でscaffoldでURL自動生成で階層化な場合の対処策ってなんで情報が少ないんだろう?(文句から始まっても仕方ない)
 
routes.rbに追記する

#config/routes.rb

  map.namespace(:media) do |media|
    media.resources :rentalitems
  end
#views/media/rentalitems/index.html

#new_rentalitem_path
new_media_rentalitem_path

こんな感じにする
 

検索しやすいように書き換え

#config/routes.rb

  map.namespace(:hoge) do |hoge|
    media.resources :fuga
  end
#models/hoge/fuga.rb
class Hoge::Fuga < ActiveRecord::Base
  set_table_name "hoge_fugas"
end
#views/hoge/fuga/index.html.rb
<h1>Listing hoge</h1>
<table>
  <tr>
  </tr>
<%- unless @hoge.nil? %>
<% @hoge.each do |hoge| %>
  <tr>
    <td><%= link_to 'Show', hoge_fuga %></td>
    <td><%= link_to 'Edit', edit_hoge_fuga_path(hoge) %></td>
    <td><%= link_to 'Destroy', hoge_fuga, :confirm => 'Are you sure?', :method => :delete %></td>
  </tr>
<% end %>
<%- end %>
</table>

<br />

<%= link_to 'New hoge', new_hoge_fuga_path %>


できた!と思ったけどnewしか動いていない。だめじゃん