rails_study
Ruby on Rails Study
学ぶよ。随時更新。
form_forとform_tagの使い分け
form_forはmodelに関係あるもの、form_tagはそうでないもの
Scaffoldingsで作ったRailsアプリの削除
$ rails destroy scaffold <appname>
$ rails g migration drop_table_<appname>
$ vim db/migrate/yyyymmddhhmmss_drop_table_<appname>.rb
http://hbnist76.blog.fc2.com/blog-entry-270.htmlのように drop_table :<table_name> を追記
$ rake db:migrate
generate scaffoldを取り消す手順
rails destroy scaffold 取り消したいScaffold名でappのmodel,view,controllerの各要素やhelper,javascript,stylesheetなどgenerate scaffoldで作られたものがすべて削除される。 が、DBが残っているのでそれはdbconsoleで消す。
mysql> drop table <tablename>;
css, javascript, sass, coffeescript の置き場
- railsはjsファイルじゃなくてcoffee scriptをデフォルトでは使おうとします http://tmiyamon.github.io/blog/2014/11/13/configure-the-behavior-of-scaffolding-in-rails/
- 3rd partyのもの: /vendor/assets 配下。
- 自作については: /lib/assets 配下。
Bootswatch を使う
見た目をとりあえず良くする コレ見てやる: http://qiita.com/susan_mamma/items/1055879e1fb9d54b3059
bootstrapでフッターを画面下に固定するcss
sticky-footerを使いましょう。 使い方: http://tkymtk.hatenablog.com/entry/bootstrap3-sticky-footer
formの選択肢をDBから持ってくるときの作戦
選択肢を表示上はCountriesのnameにし、実際に渡している値はidだったりする。そういう連携をうまくやるには collection_selectを頑張らねばならぬ http://qiita.com/budougumi0617/items/d98fc15adea4dab438e7
contracts/index.html.erbに検索フォームを用意する
get形式じゃないとダメなんだね。postで検索しようとするとレコードの作成(create)アクションに飛ばされてしまう。controller内のactionへのroutingを考えないと出来ない。 しばらくはget形式で我慢かな。 todo: 今は簡単な検索のお試ししかしていない。いい感じの検索フォームはhttp://qiita.com/nysalor/items/9a95d91f2b97a08b96b0を参考にして作る。
ダミーデータの生成
- db/seeds.rbに直接書き込む方法: http://www.rubylife.jp/rails/model/index10.html Customer.create(customer_name: ‘Google’) # モデルクラス名.create(columnname: ‘value’) で追加できる。id, created_at, updated_atは書く必要なし。
- ffakerっていうツールを使って一気に生成: http://xoyip.hatenablog.com/entry/2014/05/11/201307, 使い方: seeds.rbに書くのは変わらないけど、このgemを使って書く。
railsでの i18n (名前空間の設定、locale対応、翻訳など)
わかりやすい参考: http://alfa.hatenablog.jp/entry/2013/12/03/221308 本家: http://guides.rubyonrails.org/i18n.html
- nijuに適用した時の手順
- config/locales/application.ja.ymlに書く (config/locales 配下の .rbと.ymlは自動で読まれるらしい)
- localeをjaに変えるには、 config/application.rb で設定
form validationのナウい形
Parsleyを使うことにした。 http://parsleyjs.org/doc/index.html error_messageのlocalizationもできる、日本語も! で、よく見たらRailsへのIntegrationがあった: https://github.com/jiripospisil/parsley-rails
- installation
- gem fileにgem “parsley-rails"と書く
- bundle install
- app/assets/javascripts/application.jsに以下を追加(japanese localization含む)
//= require parsley
//= require parsley.i18n.ja
dropdown listとselect box, 選択肢をDBから取ってきて表示をbootstrapでやるときに相性が良いのは?
ややこしいタイトル書いたが、bootstrapではselectboxをうまくマークアップしてくれない様子で、bootstrap-selectというcss,jsが必要 (http://buzzword111.hatenablog.com/entry/2014/03/18/141715)。ただ、DBから選択肢を取ってくるところは書きやすい。
ULやLIタグを使ったdropdownリストであれば、bootstrapでのmarkupは簡単。DBから取ってくるのもeach文使えば大丈夫だが、行数が増えるなぁ。
で、結局とった作戦はbootstrap-selectの導入.
- rails用のbootstrap-select-railsというGemがあった。
- https://github.com/Slashek/bootstrap-select-rails に従って入れるだけ。
- 問題はerb内のcollection_selectへの書き方。つまづいた…以下を参照
厳密な定義: collection_select(object, method, collection, value_method, text_method, options = {}, html_options = {}) http://railsdoc.com/references/collection_select ばかり参考にしていたが、ここでは厳密な定義が載っていない。referenceを間違えていたようだ。 http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-collection_select を使うべき。 バージョンの違い?api reference見たほうが正確なのは間違いないので、良い教訓になった。
<%= f.collection_select :customer_id, Customer.all, :id, :customer_name, {:include_blank => true}, {:class => 'selectpicker'} %>
formの日付入力を簡単にする
controller, viewのみの作成
rails generate controller reports
member, collection - 追加のアクション
基本の7ルート以外のルートを追加したい場合はmemberかcollectionを使う。 memberは :id 付きのルートで、collectionは:idなしのルート。
GET /photos/:id/preview で preview アクションを呼ぶ設定。
resources :photos do
member do
get 'preview'
end
# または
get 'preview', :on => :member
end
GET /photos/searchで search アクションを呼ぶ設定。
passwordの管理、設定のENVへの格納
config/settings.yml これを config.ru から呼び出してENVに格納するようにする.
ENV.update(YAML.load_file('config/settings.yml')[ENV['RACK_ENV']])
テーブルにcolumnを追加する
- Railsは migration に
add_..._to_...
(またはAdd...To...
) の規則で migration名を指定すると、指定のテーブルに指定のカラムを追加する migration ファイルを作ってくれる。へぇ、すげぇ!$ rails generate migration add_<field>_to_<tablename> <field>:<type>:(unique|index) $ vim db/migrate/yyyymmddhhmmss_add_field_to.*.rb (必要に応じ修正) $ rake db:migrate
- カラム追加時にほかに更新する部分
- helper (viewをいちいち触らずに済むようにカラム群を定義してる場合), model (特にvalidation), controller (permitの中身), view (レイアウトへの追加), localeのyamlファイル (翻訳の定義)
テーブルのcolumnを削除する
$ rails g migration remove_company_to_customers company
テーブルのcolumn_nameを変更する
マイグレーションファイルを生成
$ rails g migration renameカラム名_to_テーブル名 新しいカラム名:型
例: $ rails g migration rename_vlan_id_to_vlans number:integer
テーブル間のリレーションを作る
例として、micropostsテーブルにuser_idカラムを外部キーとして設定したいと思います。 (この例では、他にcontentカラムもテーブルに設定しています。) belongs_toを使います。
class CreateMicroposts < ActiveRecord::Migration
def change
create_table :microposts do |t|
t.string :content
t.belongs_to :user
t.timestamps
end
add_index :microposts, ##:user_id, :created_at
end
end
ActiveRecordのjoinsで全カラムを取得する方法
ActiveRecordではjoinsメソッドを利用して、inner joinすることができる。
例:
Blog.joins(:article) #=> SELECT "blogs".* FROM "blogs" INNER JOIN "articles" ON "articles"."blog_id" = "blogs"."id"
ここで、問題になるのは"blogs”.*である。articlesの情報はとれていない。
joins, includes, scope, default_scope
railsプロジェクトをgit cloneしてきて始める
- mysql.sockの場所を変える
- database 作成は
rake db:create
grant all privileges on db_development.* to user_development@localhost identified by 'pass_development' with grant option;
grant all privileges on db_test.* to user_test@localhost identified by 'pass_test' with grant option;
grant all privileges on db_production.* to user_production@localhost identified by 'pass_production' with grant option;
- DBのデータを持ってくる(任意)※データだけ持ってくる方法(他のオプションはこちら)
- (コピー元)
mysqldump --no-create-info -u <dbuser> -p <dbname> <tablename> > dump.txt
- dump.txtをコピー先にscp
- (コピー先)
mysql -u user_development -p db_development < dumpdb.txt