今日の目標はCRUDできるとこまで。
ついPerlで書いてましたが、毎回フレームワークに悩むので
いっそのことRuby(on Rails)やってみます。
ちなみにRubyはいっさい知りません。
WEB+DB PRESS vol.73 2013 を参考にやっちゃいます。
※さきにrdocしないと”file ‘lib’ not found”って怒られました。
※なんか画像をテキストに変換しようとしてエラーがいっぱいでました。
※–no-ri –no-rdocつけたらさくっと入りました。
Cloning into 'rails'...
remote: Counting objects: 353918, done.
remote: Compressing objects: 100% (88818/88818), done.
remote: Total 353918 (delta 274741), reused 339425 (delta 261890)
Receiving objects: 100% (353918/353918), 53.71 MiB | 3.71 MiB/s, done.
Resolving deltas: 100% (274741/274741), done.
ドバーっとひな形ができました。
$ ls
Gemfile Gemfile.lock README.rdoc Rakefile app bin config config.ru db lib log public test tmp vendor
$ls
bundle rails rake
さっそく作ってみます。
springのほうがrailsコマンドよりはやいそうなので、springでやっていきます。
$ which spring
/usr/local/bin/spring
あります。
generateしてみます。
invoke active_record
create db/migrate/20130303074048_create_books.rb
create app/models/book.rb
invoke test_unit
create test/models/book_test.rb
create test/fixtures/books.yml
invoke resource_route
route resources :books
invoke jbuilder_scaffold_controller
create app/controllers/books_controller.rb
invoke erb
create app/views/books
create app/views/books/index.html.erb
create app/views/books/edit.html.erb
create app/views/books/show.html.erb
create app/views/books/new.html.erb
create app/views/books/_form.html.erb
invoke test_unit
create test/controllers/books_controller_test.rb
invoke helper
create app/helpers/books_helper.rb
invoke test_unit
create test/helpers/books_helper_test.rb
invoke jbuilder
exist app/views/books
create app/views/books/index.json.jbuilder
create app/views/books/show.json.jbuilder
invoke assets
invoke coffee
create app/assets/javascripts/books.js.coffee
invoke scss
create app/assets/stylesheets/books.css.scss
invoke scss
create app/assets/stylesheets/scaffolds.css.scss
これでアプリのひな形ができました。
※ちなみにひな形を消す場合はdestroyというコマンドがあります。便利です。
続いて開発用データベース作ってみます。
== CreateBooks: migrating ====================================================
-- create_table(:books)
-> 0.0024s
== CreateBooks: migrated (0.0028s) ===========================================
できたのか?
seq name file
--- --------------- ----------------------------------------------------------
0 main /home/apache/bookmanager/book
できてました。
したらERROR出た。とりあえず放置。
=> Booting WEBrick
=> Rails 4.0.0.beta1 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2013-03-03 16:54:24] INFO WEBrick 1.3.1
[2013-03-03 16:54:24] INFO ruby 1.9.3 (2012-04-20) [x86_64-linux]
[2013-03-03 16:54:24] INFO WEBrick::HTTPServer#start: pid=23633 port=3000
http://fukumura.org:3000/books
にアクセスしたら画面でました。
次に検索機能の実装をします。
まずはformをつくります。
ActiveModel::Modelモジュールをincludeするだけでそれっぽいclassが作れるとのこと。
app/models/search_form.rb
2 include ActiveModel::Model
3
4 attr_accessor :q
5 end
続いてview(books/index.html.erb)にフォーム追加します。
html: {method: :get} do |f| %>
<%= f.search_field :q %>
<%= f.submit '検索' %>
<% end %>
次に、controller側(app/controllers/books_controller.rb)を改修します。
7 @search_form = SearchForm.new params[:search_form]
8 @books = Book.all
9 if @search_form.q.present?
10 @books = @books.title @search_form.q
11 end
12 end
あと、検索処理も処理を追加します。
2 scope :title, ->(q) {where 'title like ?', "%#{q}%" }
3 end
できました。
次は、検索処理をAjax化してみます。
下記を追加。(content_tag_for便利ですね。PerlとかPHPで出会ったことない気がするけど Text::Xslateだったらありそう。)
続いて、view(app/views/books/index.html.erb)の修正。
remote: true, html: {method: :get} do |f| %>
<%= f.search_field :q %>
<%= f.submit '検索' %>
<% end %>
最後にcofeescriptの修正。
5 $('#new_search_form').on 'ajax:success', (e, books) ->
6 $('tr.book').hide()
7 ids = (books.map (b) -> "#book_#{b.id}").join(',')
8 $(ids).show()
book.jsとして展開されるんですね。coffeescript知らなすぎでした。
ここまででいったん終了。
お疲れさまでした。
