ラベル rails3 の投稿を表示しています。 すべての投稿を表示
ラベル rails3 の投稿を表示しています。 すべての投稿を表示

2014年9月9日火曜日

[Rails]DB migrationした後にrollbackもできるメソッド

忘れやすいので備忘…
DB migrationした後にrollbackしてくれるメソッド

  • add_column
  • add_index
  • add_timestamps
  • create_table
  • create_join_table
  • remove_timestamps
  • rename_column
  • rename_index
  • rename_table


上記以外は、昔のまま self.up/downで実装すること。

http://blog.jnito.com/entry/20120326/1332767292

2014年8月15日金曜日

[Rails]スネークケースとキャメルケースの変換

クラス名を元に、ファイル名.rbに変換したい場合、 あるいはファイル名.rbからクラス名に変換したい場合等、 スネークケースとキャメルケースを変換したい場合があります。 そんな時、便利なメソッドがRailsに用意されています。
camelize と underscore

 キャメルケースへ
> "camel_case". camelize
=> "CamelCase"
スネークケースへ
> "CamelCase".underscore
=> "camel_case"

2014年3月17日月曜日

[Rails]schema.rbからの読み込み

schema.rbからの読み込み
$ bundle exec rake db:schema:load

schema.rbの作成
$ rake db:schema:dump

2014年3月5日水曜日

[Rails]コントローラの命名規約

コントローラの命名規約

モデルあり:複数形
モデルなし:複数形でなくても良い

scaffoldで複数形になるのはモデルを扱うから
なるほど。

参考
http://www.rubylife.jp/rails/controller/index1.html

2014年1月20日月曜日

LazyHighCharts

rubyでグラフが簡単に作れるモジュールを探すとヒットしたのがこのLazyHighCharts。
https://github.com/michelson/lazy_high_charts

Gemfileに下記を追加
gem 'lazy_high_charts
bundle updateの実行
今回は、下記がインスールされました。
lazy_high_charts (1.5.1)


Rails3.2を利用しています。
app/assets/javascripts/application.js に下記のhighchartsの3行を追加
//= require highcharts/highcharts
//= require highcharts/highcharts-more
//= require highcharts/highstock
//= require_tree .

設定はここまで。

ここまで終えたらグラフのソースを書きます。
Controller
  def sell
    @categories = ["apple", "orange", "banana", "strawberry", "melon", "lemon", "peach"]
    @data = [40, 10, 20, 50, 30, 10, 60]
   
    @h = LazyHighCharts::HighChart.new("graph") do |f|
      f.chart(:type => "bar")
      f.title(:text => "Sample bar")
      f.xAxis(:categories => @categories)
      f.series(:name => "Fruits",
               :data => @data)
    end
  end
View
<%= high_chart("sample", @h) %>


2013年10月23日水曜日

コントローラからロケールファイルの読み込み

viewからは、こんなふうで良いけど、Controllerからは I18n を使います。
<%= t("label_login") %>

Controllerでは、
 I18n.t(:notice_saved, :text=>"xxx")


config/locale/ja.yml
ja:
  label_login: "ログイン"
  :notice_saved: "%{text}を保存しました。"



<参考>
http://rails3try.blogspot.jp/2012/01/rails3-i18n.html

2013年10月10日木曜日

Timeの差分

RailsでTimeオブジェクトを引き算した場合に日数を出したい場合

irb(main):072:0> today = Time.now
=> 2013-10-10 16:22:31 +0900
 
irb(main):073:0> beginning_of_month = Time.now.beginning_of_month
=> 2013-10-01 00:00:00 +0900

irb(main):074:0> (today - beginning_of_month).to_i/1.day
=> 9

2013年9月12日木曜日

Rails3で404エラー画面作成

RailsでRoutingErrorが出ると恥ずかしいので、404エラー画面を作ろうと思い、
どう作るんだろう?

参考
http://rochefort.hatenablog.com/entry/2013/02/25/225629

route.rbの一番最後に下記を追加
match '*path', :to => 'application#error_404'

application_controller.rbにerror_404のアクション定義。
def error_404
  error_msg = "<h2>404 Not Found</h2><p>The page you were looking for doesn't exist.</p>"
  render :text => error_msg, :status => 404
end

ここでは、render  :text=>"" にしていますが、
render :template => '/common/error_404' にして、
app/views/common/error_404.html.erb のファイルを作っても良いですね。

意外と簡単でビックリ。

BEFORE







AFTER





2013年8月28日水曜日

`autodetect': Could not find a JavaScript runtime

Rails3.2で、railsアプリを作って、コントローラをgenerateしようとしたらエラー。
以前もハマったけど、久々に新しいアプリを作るとハマるので、メモっておく。


エラーログ
/opt/bundle/ruby/2.0.0/gems/execjs-2.0.1/lib/execjs/runtimes.rb:51:in `autodetect': Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
        from /opt/bundle/ruby/2.0.0/gems/execjs-2.0.1/lib/execjs.rb:5:in `<module:ExecJS>'
        from /opt/bundle/ruby/2.0.0/gems/execjs-2.0.1/lib/execjs.rb:4:in `<top (required)>'

対処法
Gemfileに下記2行を追加して、bundle updateをすればOK
gem 'therubyracer'
gem 'execjs'

2013年8月26日月曜日

ハッシュキーをシンボルに変換

ハッシュをJSONファイルにして、また戻しての時にハマったのがキー。
JSONファイルにした後に読み込むとシンボルが文字列になってしまうんですね。
他にもいろいろそんなケースが出てきそうなんですが。

Railsの機能にあるHashキーをシンボルに変換するsymbolize_keys
> {"a" => 1, "b" => 2}.symbolize_keys
=> {:a=>1, :b=>2}


JSON.parseでJSONを読み込んでハッシュのキーをシンボルにする場合は、:symbolize_namesのオプションを付与。
>hash = {"a" => 1, "b" => 2}
=> {"a"=>1, "b"=>2}
> json = hash.to_json
=> "{\"a\":1,\"b\":2}"
> JSON.parse(json)
=> {"a"=>1, "b"=>2}
> JSON.parse(json,  {:symbolize_names => true})
=> {:a=>1, :b=>2}

2013年6月4日火曜日

Railsのform_forとパラメータ

form_forを使っている所で、パラメータを渡すのに f.hidden_field を利用した場合、
該当するフィールドがない時に
  WARNING: Can’t mass-assign these protected attributes: id
といったエラーが出ます。

どうやってパラメータを渡せば良いんだろう…?

hidden_fieldではなく、form_forの引数で渡します。


例) project_idを渡したい場合
・新規作成画面へ遷移する時に、コントローラで渡す値を設定
  def new
    ...
    @project_id = xxx
    ...
  end

・new.html.erb の review_record_index_pathのところにパラメータを設定をすると保存ボタン押下時にcreateのところまで渡すことができます。

<%= render(:partial => 'form', :locals => {:path => review_record_index_path(@review_records, :project_id=>@project_id)})  %>


・保存ボタン押下後
  def create
    ...
    puts params[:project_id]
    ...
  end

あまりうまく説明できないけど、こんな感じ…(^^;

2013年5月29日水曜日

passengerのインストール失敗

passengerのインストールの失敗で、スワップ領域が足りなくてエラーになる場合があるそうです。
実際私もハマりました。
この時インストールしたのは、passenger4.0.4でした。
https://groups.google.com/forum/?fromgroups=#!topic/phusion-passenger/V-t5xsHJ4Sw

こちらのサイトにもありますが、同じエラーがでましたね。

rake abortedのエラーがでて、こんなのがずらずら…。

g++ -o agents/PassengerHelperAgent.o  -Iext -Iext/common  -Iext/libev -Iext/libeio -D_REENTRANT -I/usr/local/include -DHAS_TR1_UNORDERED_MAP -DHAVE_ACCEPT4 -DHAS_ALLOCA_H -DHAS_SFENCE -DHAS_LFENCE -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-long-long -Wno-missing-field-initializers -ggdb -feliminate-unused-debug-symbols -feliminate-unused-debug-types -DPASSENGER_DEBUG -DBOOST_DISABLE_ASSERTS -fcommon -fvisibility=hidden -DVISIBILITY_ATTRIBUTE_SUPPORTED -Wno-attributes -c ext/common/agents/HelperAgent/Main.cpp


サーバーを再起動したらあっさり入りました。

2013年5月27日月曜日

Passenger 4

ようやく出たと、話題になってるPassenger4。
Ruby2.0と一緒に動かそうとするのだけどなかなか動かず。
先ほどちょうど動きました。
Passenger4.0.3が先週金曜日に出たばかりですね。
http://rubygems.org/gems/passenger
ちょうど金曜日に4.0.2と格闘していて全然ダメだったのですが、4.0.3では結構あっさりと動きました。

  • Ruby2.0.0-p195
  • Rails 3.2.6 (そろそろ3.2.13にしないとな)
  • Passenger 4.0.3

インストールした後、apacheで動かしてみたら
"This application is a Rails 3 application, but it was wrongly detected as a Rails 1 or Rails 2 application. "
こんなエラー…。
そいや、以前もこれ見たな…。
腰を据えて調査してみた所、Apacheの設定が変わったようです。
ここを、こんなふうに変えてあげれば良いのです。
RailsBaseURI /report
 ↓
RackBaseURI /report

Rails3から変更が必要らしいのですが、今までRails3でもRailsBaseURIで動いてたんですよね…。
うーん…

2013年5月24日金曜日

Passengerのインストール

私がよくやらかすエラー。
実行する場所が違うのです…。rails アプリの外でやりましょうってことですね。
エラーが出たら、cd.. でだいたい行けます。

$ passenger-install-apache2-module
/home/xxx/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/site_ruby/2.0.0/rubygems/dependency.rb:296:in `to_specs': Could not find 'passenger' (>= 0) among 102 total gem(s) (Gem::LoadError)
        from /home/xxx/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/site_ruby/2.0.0/rubygems/dependency.rb:307:in `to_spec'
        from /home/xxx/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_gem.rb:47:in `gem'
        from /home/xxx/.rvm/gems/ruby-2.0.0-p0@rails3/bin/passenger-install-apache2-module:18:in `<main>'
        from /home/xxx/.rvm/gems/ruby-2.0.0-p0@rails3/bin/ruby_noexec_wrapper:14:in `eval'
        from /home/xxx/.rvm/gems/ruby-2.0.0-p0@rails3/bin/ruby_noexec_wrapper:14:in `<main>'

2013年1月11日金曜日

Rails3 ロケールファイルの引数と呼出し方

引数の記述方法と呼出し方法を忘れやすいのでメモ。

ja.yml
label_request: "要望"
label_test: "テストは %{count} 件です"
label_test2: "予定 %{field} 完了数"

xxx.html.erb
# @count = 5 の場合
<%= t('label_test', :count=>@count)%>
<%= t('label_test2', :field=>t('request'))%>

上記のように、引数に別のラベルを入れることも可能。

2012年11月1日木曜日

ActionMailerの使い方

Rails3でActionMailerを用いたメール送信について。
ファイルは多い感じですが、いたって簡単。

◆雛形の生成
$ rails g mailer WeeklyMailer
      create  app/mailers/weekly_mailer.rb
      invoke  erb
      create    app/views/weekly_mailer
      invoke  rspec
      create    spec/mailers/weekly_mailer_spec.rb

◆差出人、送信先、本文の送り方
# app/mailers/weekly_mailer.rb
class WeeklyMailer < ActionMailer::Base
  default from: "abc@example.com"

  def weekly_email

    @date = Period.date_from

    recipient = "xxx@example.com"
    subject = "お知らせ @date"
    mail(:to => recipient,
         :subject => subject)do |format|
      format.html # HTML形式
      format.text # テキスト形式
    end
  end
end

◆ テンプレートの書き方
こちらでは、HTML形式のビューの書き方を紹介。
bodyタグ内を書けば良し。
text形式の場合は、ファイル名を weekly_email.text.erb にして不要なタグをなくせばOK。
# app/views/weekly_mailer/weekly_email.html.erb

<!DOCTYPE html>
<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
  </head>
  <body>
    <p>てすと</p>
  </body>
</html>

◆コントローラから呼び出し
週次にcronから呼びたいので、こちらに。
ボタン押下してメール送信したいほうが多いかな?
class WeeklyMailController < ApplicationController
  class << self
    def exec
      WeeklyMailer.weekly_email.deliver
    end
  end
end

◆実行
rails r WeeklyMailController.exec

◆デバッグ
こちらより→ http://blog.twiwt.org/e/a986c5

# config/initializers/action_mailer_log_subscriber.rb
require 'action_mailer/log_subscriber'

module ActionMailer
  class LogSubscriber
    def deliver_with_debug(event)
      deliver_without_debug(event)
      debug(Mail.new(event.payload[:mail]).subject)
      debug(Mail.new(event.payload[:mail]).body)
    end
    alias_method_chain :deliver, :debug
  end
end


◆ Configファイル (開発環境)
ここまでやって、エラーもないし、送られてるはずなんだけど、届いてない!
そんな時は、定義ファイルの設定を確認しましょう。

config/environments/development.rb

  config.action_mailer.raise_delivery_errors = true  #デフォルトはfalse
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
      :enable_starttls_auto => false,    ## ないとエラー(※)がでる
      :address        => 'xxxxx.example.com',
      :port           => 250,
    }

※エラー内容
bundle/ruby/1.9.1/gems/railties-3.2.6/lib/rails/commands/runner.rb:53:in `eval': hostname does not match the server certificate (OpenSSL::SSL::SSLError)
        from /home/xxx/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/smtp.rb:585:in `tlsconnect'
        from /home/xxx/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/smtp.rb:560:in `do_start'
        from /home/xxx/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/smtp.rb:519:in `start'
...

TLS接続を使用としてエラーになっているみたいなので、TLS接続をしないようにすれば良いらしい。

◆ メールの差出人に日本語名を出したい場合
gemがないと文字化けしますので、bundleに追加。
gem 'mail-iso-2022-jp'
差出人を書く所は、こんな書き方になります。
default from: "なまえ<aaa@example.com>", :charset => 'iso-2022-jp'

◆参考
http://edgeguides.rubyonrails.org/action_mailer_basics.html

2012年10月30日火曜日

rails g のロールバック

rails g もしくは、 rails generate でファイルを生成した際に、名前を間違えたからやり直したい場合があると思います。
その際には、一個ずつ消さなくても、rails destroyで元通りにしてくれます。
いつもrollbackと打とうとして忘れるんですよね。。destroyです。

$ rails g model latest_info
      invoke  active_record
      create    db/migrate/20121030042916_create_latest_infos.rb
      create    app/models/latest_info.rb
      invoke    rspec
      create      spec/models/latest_info_spec.rb

infos って微妙と思い…。

$ rails destroy model latest_info
      invoke  active_record
      remove    db/migrate/20121030042916_create_latest_infos.rb
      remove    app/models/latest_info.rb
      invoke    rspec
      remove      spec/models/latest_info_spec.rb

画面に表示させるテキストの改行処理方法

DBからデータ取得をして、画面に表示させる際に、\n を <br/>にしたい場合
gsubで、\n を <br /> に変換しなくても simple_format という便利なライブラリがあります。
こんな感じに書くだけ!
<%= h simple_format(text) %>
http://railsdoc.com/references/simple_format
文字列を<p>で括る
改行は<br />を付与
連続した改行は、</p><p>を付与


人によっては、生成される<p>タグがうざいと思う人もいるかも…。

2012年10月17日水曜日

カスタムバリデーションの作り方

Rails3でカスタムバリデーションを作ってみました。
Rails2ですら作ったことなかったのですが、思ったより簡単でした。

config定義
バリデーションクラスを置く場所を定義します。
# config/application.rb
config.autoload_paths += %W(#{config.root}/lib/validators)

バリデーションクラス
options[:message]がバリデーションチェック対象の項目名。
今回はリポジトリ名(name)になりますが、
「リポジトリ名は存在しません。」というようなエラーになります。
# lib/validators/repo_presence_validator.rb
class RepoPresenceValidator < ActiveModel::EachValidator
  def validate_each(object, attribute, value)
    unless mail_groups(value)
      object.errors[attribute] << (options[:message] || "は存在しません")
    end
  end

private
  def mail_groups(value)
   ...
  end
end

モデル
青字部分が今回作ったバリデーションを呼んでる所になります。
validates :name, :presence => true, :repo_presence => true
<参考>
http://railscasts.com/episodes/211-validations-in-rails-3
http://hajimete-ruby.jugem.jp/?eid=69

2012年10月9日火曜日

複数テーブルのJOIN

ActiveRecordを使って、複数テーブルのJOINをする際にincludesを使う場合、
複数テーブルをどうやって指定すれば良いのだろうと調べてました。

ひとまず忘れないうちにメモっておきます。

1テーブルのみJOINする場合は、下記のようにかけるのですが、
さらに遡リたい場合はどうすればよいのだろうと。
下記は、projectsがclient_idを持ってるイメージ。
Project.includes(:client)

2テーブルJOINする場合は、下記のように配列とハッシュの組み合わせになります。
こんなふうに書くと、どんどん遡ってかけます。
下記は、teamsがproject_idを持っていて、projectsがclient_idを持ってるイメージ。
Team.includes(:project => [:client])
さらにwhere句を付ける場合は、下記のようにテーブル名をつけてあげます。
Team.includes(:project => [:client]).where("clients.code = ? ", code)