Rails

検証とモデルにまとめることのジレンマ

モデルにまとめすぎると検証はどうするのか、検証はコントローラでやってモデルに処理を渡す。 #Controller if @user.valid? #モデルに処理を渡そう else render ** end

valid?について

valid?するとインスタンスに、エラーが反映される

リファクタリング

■このサイトは面白い http://refactormycode.com/ ここから学んだ例1 C:\WINDOWS\system32>irb irb(main):001:0> (0..9).to_a => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] irb(main):003:0> ("a".."z").to_a => ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j",…

メモ:関連付けを行うメソッド

最後にこれかくと、t/fで保存が成功したかわかる def add_user_to_favorite_list(favorite_user) flag = favorite_user.set_flag favorite = Favorite.new favorite.set_flag(flag) self.favorites << favorite end

ルーティング

map.connect '',:controller => "users/account",:action => "index" 書いて、public/index.htmlを削除する。 こうかくと、loaclhost:3000にアクセスすると、localhost:3000/users/account/index を呼んでくれる。redirectでないので、URLもそのまま! もち…

モデルのメソッドに関して

メソッドの内に書く変数として、属性値なら、name、関連先が絡んでいるなら、self.mailsと 明示したほうがいい気がする 同様の理由で、メソッド名事態も、関連なら@user.get_diariesとかにする方がいいかもしれない。 @user.diariesだと、直接関連しているよ…

has_manyとfind

■has_manyまたはhbtmに対しては、その属性自体もfindメソッドを持つ user.flags.find_all_by_flaggable_to_type("Diary") ※flagsというのはポリモフィックアソシエーション用に使っているそのユーザが仮想的なメールのやりとりをする場合、次のようなコード…

テストの直書き回避

ユニットテストでは、assert_equalとかのときに直書きをすることが多い。 何故なら、変数を利用した場合、両方ともnilで等価になったり、両方とも未変換で 等価になってしまったりしても分からないからである。 この問題を解決するなら次のような一文を入れ…

モデルの共通部分はどこに設置する?

http://wota.jp/ac/?date=20070902

エラーレポート(if a = *** && b = ***)

ではまった。 日記のコメントの修正時に、「修正」を押すと、jp_mobileでフィルタエラー 対応策:mobile_fiterを解除したら、なぜか@userに日記のインスタンスが入っていた。 return unless (@user = get_diary_owner && @diary = get_diary)ここが悪かった…

更新と確認画面

■今回は、edit操作に対して確認画面をつけることを考える これを参考にするとよい http://www.fdiary.net/ml/rails/msg/290しかし、generatorが最新のrubyでは正しく動作しない場合がある。generate.rbを編集する。 このscaffoldの確認画面の実現方法は、con…

テストに関して(所属モデルの更新)

■自分が持っている他のモデルを更新するには、自分をreloadすればよい post :update, :id => @user.diaries.first.id,:diary => parameters assert_equal @valid_data.title, user.reload.diaries.first.title

続・フォームと確認ページ

■http://d.hatena.ne.jp/LukeSilvia/20070921/1190418225の続編前の日記では、確認ページを作成するのにセッションを使った。 しかし、ずっと簡単かつ堅実な方法があった。 それは、HIDDENを使うというものである。 作戦としては、確認ページから「修正」や…

フォームの確認ページとvalidates_length_of

■フォーム入力した後の確認ページを作成する方法を考える 色々方法はあるが、今回はセッションを使う方法を考える。 もっといい方法はこちら 作戦はこうだ。 ・フォームからパラメータを受ける ・検証を行なう ・セッションに値を入れる ・確認ページを表示…

ポリモフィックアソシエーション

1つのオブジェクトを複数のオブジェクトと関連付けることが出来る。 例えば、SNSなどである、コメントや足あと。どちらも、「あるユーザーが何に対して」コメントする、 足あとをつけるという構造になっている。ここを抽象化したいと考えた。よって「誰が何…

DRYなメソッド達

□メソッドのやることは基本的には1つ。このくらい細かくていい def price nil end def end? period_to.nil? ? false : period_to < Date.today end def for_only_pc? useragents.size == 1 && useragents.first.name == 'PC' end def self.order 0 end

user_id => @userとすれば、@user.idと同じになる

userがnew_recのときは、nilになってくれる。nil.idエラーにならないから便利

テストでのセッション管理

□テストヘルパーにこれをおくと便利 def create_session @request.session[:company] = Company.authenticate("fukushige", "ruby") end

レイアウト。情報を上に上げていく

ある画面だけ、テーマ色を変えないといけないとき 一番下 @color = "new_color" それをレンダリングしているテンプレート @color = (@color || base_color) それをレンダリングしている全体のテンプレート @colorを色指定に使う。 <% @title = "ユーザー情報…

テストに関して

assert_redirected_to は、テンプレートの有る無しを見ない

テストで日本語

C:\ruby\lib\ruby\gems\1.8\gems\rake-0.7.2\lib\rake\rake_test_loader.rbに書けばOK #!/usr/local/bin/ruby -Ku environment.rbに$KCODE指定をした場合は、これを書かないと、日本語のせいでテストで 落ちることがある。

フラッシュもセッション

よって、reset_sessinoすると消えてしまうので注意

アプリでメールを受信する(連携編)

では、実際にサーバーと連携して、アプリでメールを受信します。 作戦としては、sendmailでメールを受け取って、外部プログラムにパイプする。という感じ。 まずはメールの設定。ここでは、前提として、sendmailで外部からメールを送信できる。受信できる と…

メールを受信する(テスト編)

■テストコード まず、mail.txtを作成。参照:http://i.loveruby.net/ja/projects/tmail/doc/basics.html ▼最初にプロンプトからrunnerを使ってみよう。 C:\Rails\app\trunk>ruby script/runner 'MailHandler.receive(STDIN.read)' ※この時、mail.txtはRAILS_…

リダイレクトだとフィルタはかからない?

■これは勘違い以下のような状況で起きた before_filter :reset_ses, :only => :index def to_index redirect_to :action => "index" end private def reset_ser reset_session end ---------------------------- ここで、テスト def test_reset_ses test_log…

プラグインから学ぶ

継承の使い方とか本当に勉強になる スーパーに共通を定義、各クラスで継承。 継承しなかったところ(あてはまらない場合)の初期値(デフォルトの振る舞い) として、スーパーで定義できる

AR.createとvalidationにはまる

class User < ActiveRecord::Base validates_presence_of :name end という検証をかけた状態で下記のテストをしたらこけた。 def test_invalid_create_with_no_params assert !User.create end script/consoleで確認したら、createとvalidateは特に関係なし…

メール画像アップ(メモ)

http://techno.hippy.jp/rorwiki/?HowToReceiveEmailsWithActionMailer http://www.techscore.com/tech/OtherTech/rubyonrails/4.html http://ishikawa-rs.blogspot.com/2007/02/filecolumn-and-capistrano.html

rake test:functionalsにはまったら

rakeとかrubyでテストすると落ちないが、test:functionalsすると落ちると言う場合 fixtureファイルが必要な時点で用意されていない可能性がある。 rubyでテストする際には、その前のrakeとかでDBが出来上がっているのでできる。 ためしに、rakeを途中でabo…

携帯アプリテスト(簡単ログイン・固体識別番号)

■携帯化にはJpMobileを使用 まず、テストを拡張(http://d.hatena.ne.jp/LukeSilvia/20070823/1187916584) @request.user_agent = "DoCoMo/2.0 D902i(c100;TB;W23H16;ser999999999999999;icc0000000000000000000f)" こうすればidentでとれる。