はじめてのRuby on Rails、トラブル記録
スポンサーサイト

一定期間更新がないため広告を表示しています

posted by スポンサードリンク | | - | - | - |はてなブックマーク - スポンサーサイト
Rails3で仮想モデルを作る
フォームで、DBにテーブルは持ってないけどバリデーションはしたいって時がある。
仮想モデルが作れれば万事解決なんだけどと思ったら、やっぱりできました。

ここを参考にすればOK↓
http://railscasts.com/episodes/219-active-model

モデル内のinitializeクラスとpersisted?クラスは書かないとエラーが出るよ。
posted by トモト | 19:02 | Rails3.x | comments(0) | trackbacks(0) |はてなブックマーク - Rails3で仮想モデルを作る
RailsのlocalでYes、Noを使うときの罠
localeのymlファイルでは普通
hogehoge: ほげほげ
のように書くけれど、
Yes: はい
No: いいえ
はできない。
"Yes": はい
"No": いいえ
ならOK。
posted by トモト | 16:20 | Rails小ネタ | comments(0) | trackbacks(0) |はてなブックマーク - RailsのlocalでYes、Noを使うときの罠
named routesのform_forの書き方
Rails3のルーティング設定では、:as => hogehogeでルートの名前を変えることができます。

これを使って以下のように名前を変えました。
config/routes.rb
resources :usersettings, :as => :settings

そしたら、form_forが普通の形だと動かなくなりました冷や汗
デフォルトだとform_forはこんな風になっています。
<%= form_for @usersettings do |f| %>
でも、これだとNo route matchesが出てしまいます。

こうしたらちゃんと動きました。
New
<%= form_for @usersettings, :url => settings_path do |f| %>

Edit
<%= form_for @usersettings,
  :url => {:controller => :usersettings, :action => :update, :id => @usersettings.id } do |f| %>

Editの方がなんかもうちょっとすっきり書けないかと思うけど…まあこれで動くのでとりあえずこれでパー
posted by トモト | 23:45 | Rails3.x | comments(0) | trackbacks(0) |はてなブックマーク - named routesのform_forの書き方
Rails3 ActiveMerchantでPayPalの設定
PayPalの設定はホントめんどくさい。Rails2.3で作った前のプロジェクトはその名も「PayPal」というプラグインを使って実装したけれど、なくなってしまったのか、見つからないので仕方なくめんどくさそうだなーと前回回避したactivemerchantを使うことに。

・決済方法
PayPalの決済方法って色々あって、前はよくわかってなかったけどWeb Payment Standardを使っていた模様。
PostでPayPalに金額とか投げて、IPN(Instant Payment Notification)で支払われたらその情報をこちらのサーバーのデータベースに反映するという形。IPNについては詳細はググッてください。
でも、どうもExpress Check inという方がどうも良さ気な感じだったので、Express Check inにすることに。というか、サンプルソースがExpress Check inだったのでそっちのが楽だった汗

Web Payment StandardとExpress Check inの差は以下のサイトが参考になります。
PayPalの提供する決済サービスの種別 http://takahashifumiki.com/web/programing/1312/

・PayPal Express Paymentでの実装サンプル
なんとサンプルプロジェクトまるごと公開。記事の説明もわかりやすい。
多少プロジェクトに合わせてカスタマイズは必要かもしれないけれど、ほぼこのまま使える!感謝…!!
PayPal Express Payments with ActiveMerchants with ActiveMerchant

・PayPalAPIのUser name, Password, Signatureはどこでわかるか。
私はわからなかったので。
↓のページは画面のキャプチャつきでわかりやすいです。
http://help.wildapricot.com/display/DOC/Requesting+PayPal+API+Signature

・使う通貨を日本円に変える
config/environment.rbに以下の一行を追加
ActiveMerchant::Billing::PaypalExpressGateway.default_currency = "JPY"

・定期購読
定期購読の実装サンプルは以下のページが参考になります。
Active Merchant + Paypal Recurring Payment http://www.naivehack.com/2010/11/24/active-merchant-paypal-recurring-payment/
定期支払い周りの変数一覧(公式)
https://www.paypal.com/jp/cgi-bin/webscr?cmd=p/acc/ipn-subscriptions-outside

・PayPal公式ドキュメント
最後ですが。公式の注文管理統合ガイド。PDTとかIPNとかその他もろもろ。
これ見ただけれはできないけれど、全体的に知っておく必要が有りげな感じ。変数とかも載ってるので必須。
https://www.paypalobjects.com/WEBSCR-640-20110722-1/ja_JP/JP/pdf/PP_OrderManagement_IntegrationGuide.pdf
posted by トモト | 17:03 | Rails3.x | comments(0) | trackbacks(0) |はてなブックマーク - Rails3 ActiveMerchantでPayPalの設定
collectって便利
なんと説明すればいいのか、説明がしづらいのですが。
とあるモデルの検索結果の1カラムを使って、別のモデルを検索する方法とでもいいましょうか。

UserとFollowerという2つのモデルがあるとします。
FollowerはUserの子モデルです。

Followerにはuser_idとfollower_idがあります。
current_user.followersとすると、current_userをfollowしているuserのidが集まります。
このfollowerのuserモデルを全部集めたいのです。

そんなときは、collectを使えば一発!チョキ
@followers = User.where('id IN(?)', current_user.followers.collect(&:following_id))

すごい!簡単!まさしく探してたヤツ!!


【参考】http://wota.jp/ac/?date=20060309
posted by トモト | 00:00 | Rails小ネタ | comments(0) | trackbacks(0) |はてなブックマーク - collectって便利
gitでerror: error setting certificate verify locationsが出た場合の対処方法(Windows)
gitでプラグインをインストールしたら、こんなエラーがでました。
error: error setting certificate verify locations:
    CAfile: /c/Program Files (x86)/Git/bin/curl-ca
    CApath: none
while accessing https://github.com/marcel/aws-s3.git/info/refs

fatal: HTTP request failed

ググって調べた結果、Windowsだとgitconfigファイルに以下の内容を追加したらなおりました。
[http]
    sslcainfo = C:/Program Files (x86)/Git/bin/curl-ca-bundle.crt
[http]はもう書いてあれば書かなくてOK。

gitconfigファイルはGit/etc/の下にあります。ま、ファイル検索すれば良いかな。

元記事参照すむとこだけど、英語なので、日本語の人がたどり着きやすいように日本語で説明させてもらいましたー。

【参考】
git, Windows 7 & error: error setting certificate verify locations:
posted by トモト | 16:58 | エラー | comments(0) | trackbacks(0) |はてなブックマーク - gitでerror: error setting certificate verify locationsが出た場合の対処方法(Windows)
Rails3でカスタムバリデーション
Rails3ではValidationがかなり変わりました。色々てこずったのだけど、さくっとできるナイスな手順を書いておきまーす。

 【1】Validation用のフォルダを作る

私はlibの下にvalidatorsフォルダを作りました。

 【2】validatorsフォルダを自動的に読み込むようにする。

config/application.rbに、以下の一行を追加します。
config.autoload_paths += %W(#{config.root}/lib/validators)

class Application < Rails::Applicationの中のコメント上から5行目あたりに書き方の見本があります。
そこに書けばよろしいかと。

【3】カスタムバリデーションを書く


クローバー validates_eachの場合
これは、フォームで年月だけを入力して、その入力された月が今月より前かどうかを判定するバリデーションです。

lib/validators/before_month_validator.rb
class BeforeMonthValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    record.errors[attribute] << 'must be before or equal to this month' if value.beginning_of_month >= Time.now.beginning_of_month.to_date
  end
end
Model
validates :since, :before_month => true

注意点
  • validates_eachの場合は、ActiveModel::EachValidatorになる。
  • モデルではファイル名からvalidatorを抜いた名前で呼べばいい。
それくらいしかないかも。validates_eachの方はめっちゃ簡単です!

クローバー validates_withの場合
lib/validators/different_from_validator.rb
class DifferentFromValidator < ActiveModel::Validator
  def validate(record)
    if record.send(options[:a]) == record.send(options[:b])
      record.errors[:base] << "#{options[:b]} must be different from #{options[:a]}"
    end
  end
end
Model
validates_with DifferentFromValidator, :a => :since, :b => :until

注意点
  • 複数の値を見るバリデーションはvalidates_withを使う。validates_eachでできないか挑戦したけどできず。
  • validates_withの場合はクラス名フルネームで呼ばなきゃいけない。
  • validates_withの場合はActiveModel::Validatorになる。
  • def validate(record)と(record)を入れる。
  • モデル側で「:hogehoge => :nantoka」と書いたオプションを「options[:hogehoge]」で値を取れる。
  • record.send(options[:a])で:aのvalueを取得。
    :a => :since / record.send(options[:a])だったら、Rails2.xだったらself.sinceと書いてるとこ。

self.hogehogeが使えなくて、どうやって値を取るのかかなり探してしまった……汗
バリデーションのファイル名は必ず「なんとかかんとか_validator」にしなければなりません。validatorついてなかったら読み込んでくれなかった。クラス名とファイル名も一致してないとだめだった。
たくさんのバリデーションを一つのファイルに書く方法はあるのかな?謎。

でも一回やり方わかってしまえば、シンプルに書けて使い回しできるのでとても便利!
Rails2.xの時にはかなりぐちゃぐちゃになりがちだったので、コードがすっきりしてうれしい楽しい
posted by トモト | 18:15 | Rails3.x | comments(0) | trackbacks(0) |はてなブックマーク - Rails3でカスタムバリデーション
select_tagのオプションに配列を使う
selectフォームで、年だけ選択するやつが作りたいと思いました。 

date_selectで:discard_month => true, :discard_day => trueをつけても 
見た目は年だけのセレクトになるのだけれど、保存する側のカラムがintegerだと 
multi parameterなんちゃらエラーが出て対応するのが面倒だったので、 
純粋に「2011,2010,2009...」とかのセレクトフォームを作ったほうがいいやとなったので。

まずModelに年数の配列をセットします。
def new
  @years = Array.new((1950..Time.now.year).map{|y| [y,y]}.reverse)
end
reverseは降順にするためにつけてます。ほかのModel.newとかは上には書いていないので適宜。 

Viewではこんな感じで呼びます。
<%= f.select(:year, options_for_select(@years, @history[:year])) %>

超簡単! 

@history[:year]はselectedの値。エラーが出た場合にその前に入力していた値がそのまま選択されているようにするために入れる必要があります。(Historyモデルだったとして)

実はこれをやるのにどうやろうか悩んで調べてしまいました…。ハズカシイ。 options_for_select([name,value],[name,value])って感じでいつも配列書いてるんだから当たり前じゃんて感じしょんぼり

配列の中身を変えれば、Viewでオプションの中身をごちゃごちゃ書かなくて済むので全般的にこの書き方は良さそう。
posted by トモト | 14:42 | Rails小ネタ | comments(0) | trackbacks(0) |はてなブックマーク - select_tagのオプションに配列を使う
Rails3でjQueryを使う
WEB+DB Pressを参考にしつつ…

railsでjqueryを使うには、jquery-ujsというプラグインを使えばいいみたいです。
jquery-ujs: https://github.com/rails/jquery-ujs

ほとんどgitに書いてあるまんまですが以下手順。
1
gem 'jquery-rails', '>= 0.2.6'
2
bundle install
3
rails g jquery:install
特に何も意識せずプロジェクトを作ると、prototype.jsがpublic/javascriptの中に予め入ってるんですが、jqueryを入れたとき、それがあるとバッティングしてよろしくないらしいです。
しかし、rails g jquery:installをやると、必要なjsファイルを追加してくれるだけでなく、そのいらないprototype.js関連のファイルを消してくれます。すばらしい!!

ところで、ここでjquery:installすると、以下のようなエラーが出ることがあります。(私は出ました)
D:/ruby-1.9.2-p136/lib/ruby/1.9.1/net/http.rb:677:in `connect': SSL_connect retu rned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)

そんな時には、config/application.rbの末尾にでも以下の2行を追加すれば回避できる模様。
require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

【参考】aki note: Rails3 で jQueryUI を使いたい!protptype.js から jQuery に移行するよ
posted by トモト | 23:18 | Rails3.x | comments(0) | trackbacks(0) |はてなブックマーク - Rails3でjQueryを使う
named_scope内で条件分岐する
[RAILS 2.xにて確認]*Rails3.xでは未確認です。

DBからランダムでX件取ってくるようにしようと思ったんですが、
productionはpostgresSQLでランダムはRANDOM()、developmentはMySQLでRAND()という別の関数だったので、
productionかdevelopmentで分岐するようにしたいと思いました。


それで、named_scope内で分岐できないかなーと思って調べた結果、こんな感じでできました
named_scope :ord_rand, lambda{|e|
if e == 'production'
{:order => 'RANDOM()'}
else 'development'
{:order => 'RAND()'}
end
}

コントローラー側では以下のように書いておきます。
@user = User.ord_rand(RAILS_ENV)


うん、すっきり

caseも使えるみたいです。↓
【参考】Aerialarts: named_scopeの引数による条件分岐CommentsAdd Star
posted by トモト | 18:21 | Rails小ネタ | comments(0) | trackbacks(0) |はてなブックマーク - named_scope内で条件分岐する
Rails3レシピブック 190の技
Rails3レシピブック 190の技
ついにRails3対応版が出ました!!
WEB+DB PRESS Vol.58
WEB+DB PRESS Vol.58
Rails2系から3への移行時に知りたいことがひとまとまりになっててよかった!色々ググるよりこれを読む方が早い。
Rubyレシピブック 第3版 303の技
Rubyレシピブック 第3版 303の技
Rubyやるならこのリファレンスは必要。
Search this site