サブディレクトリの下にセットする
久しぶりすぎて何から手をつけるんだか忘れ気味なのでがんばってメモを取る。
(自分用のメモ、他の人には関係なし)
最初(失敗している)
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しか動いていない。だめじゃん