rails_study

Page content

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 の置き場

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を参考にして作る。

ダミーデータの生成

railsでの i18n (名前空間の設定、locale対応、翻訳など)

わかりやすい参考: http://alfa.hatenablog.jp/entry/2013/12/03/221308 本家: http://guides.rubyonrails.org/i18n.html

  • nijuに適用した時の手順
    1. config/locales/application.ja.ymlに書く (config/locales 配下の .rbと.ymlは自動で読まれるらしい)
    2. 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
    1. gem fileにgem “parsley-rails"と書く
    2. bundle install
    3. app/assets/javascripts/application.jsに以下を追加(japanese localization含む)
//= require parsley
//= require parsley.i18n.ja
  • ややこしいタイトル書いたが、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の導入.

    1. rails用のbootstrap-select-railsというGemがあった。
    2. https://github.com/Slashek/bootstrap-select-rails に従って入れるだけ。
    3. 問題は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の日付入力を簡単にする

bootstrap-datepicker-rails

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

http://ruby-rails.hatenadiary.com/entry/20140814/1407994568

railsプロジェクトをgit cloneしてきて始める

  1. mysql.sockの場所を変える
  2. 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;
  1. DBのデータを持ってくる(任意)※データだけ持ってくる方法(他のオプションはこちら
  2. (コピー元) mysqldump --no-create-info -u <dbuser> -p <dbname> <tablename> > dump.txt
  3. dump.txtをコピー先にscp
  4. (コピー先) mysql -u user_development -p db_development < dumpdb.txt