スポンサーサイト
2013.07.04 Thursday
一定期間更新がないため広告を表示しています
はじめてのRuby on Rails、トラブル記録
RailsのlocalでYes、Noを使うときの罠
2011.11.01 Tuesday
localeのymlファイルでは普通
hogehoge: ほげほげ
のように書くけれど、
Yes: はい
はできない。No: いいえ "Yes": はい
ならOK。
"No": いいえ collectって便利
2011.07.01 Friday
なんと説明すればいいのか、説明がしづらいのですが。 とあるモデルの検索結果の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 select_tagのオプションに配列を使う
2011.04.27 Wednesday
selectフォームで、年だけ選択するやつが作りたいと思いました。
date_selectで:discard_month => true, :discard_day => trueをつけても 見た目は年だけのセレクトになるのだけれど、保存する側のカラムがintegerだと multi parameterなんちゃらエラーが出て対応するのが面倒だったので、 純粋に「2011,2010,2009...」とかのセレクトフォームを作ったほうがいいやとなったので。 まずModelに年数の配列をセットします。 def new
reverseは降順にするためにつけてます。ほかのModel.newとかは上には書いていないので適宜。 @years = Array.new((1950..Time.now.year).map{|y| [y,y]}.reverse) end Viewではこんな感じで呼びます。
<%= f.select(:year, options_for_select(@years, @history[:year])) %> @history[:year]はselectedの値。エラーが出た場合にその前に入力していた値がそのまま選択されているようにするために入れる必要があります。(Historyモデルだったとして) 実はこれをやるのにどうやろうか悩んで調べてしまいました…。ハズカシイ。
options_for_select([name,value],[name,value])って感じでいつも配列書いてるんだから当たり前じゃんて感じ 配列の中身を変えれば、Viewでオプションの中身をごちゃごちゃ書かなくて済むので全般的にこの書き方は良さそう。 named_scope内で条件分岐する
2011.02.09 Wednesday
[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 ラジオボタンをクリックするとアクションを呼ぶようにする
2011.01.27 Thursday
フォームを監視して選択された内容によってアクションを読んだり、ページ内の一部を更新したりするのはobserve_fieldでできるけれど、 こっちの方が実際のボタンのコードのところに置けるのでいいなと思ったのでメモ。 View <%= f.radio_button :type, 'hoge',
・このラジオボタンを選択したときに、total_numberアクションが呼ばれる。{ :onclick => remote_function(:update => "total", :url =>{ :action => 'total_number'}, :submit => :user) } %> <span id="total><%= render :partial => 'total' %></span> ・:submit => :userでform_for @userに入力された内容がコントローラーに送られる。 ・:update => "total"で、ページ内のid="total"部分が更新されるよう指定。 Controller def total_number
@key = params[:user][:type] // userモデルのラジオボタン:typeの内容を取得の例 // なんやかんや適当にやりたい処理を入れて…… render :partial => 'total' end こんな感じ。 ちなみに、render :partial => は複数の違う種類のテンプレートをやる方法がない模様。 1つしかできないのはちょっと不便 named_scopeで検索結果が1件の場合
2010.10.29 Friday
毎回Find使って検索するのが面倒なのでnamed_scope大好きなんだけれど、 named_scopeはFind :allだということを忘れて、 結果が1件だけ返るときによく書き方を間違えてバグらせるのでメモ。 たとえばマイミクみたいな感じでユーザー同士をFriendsとして登録するFriendsモデルがあったとして。 以下のようにAさんとBさんのIDを入れて一致したデータを取り出すようなnamed_scopeを作りました。 named_scope :match, 最初に書いたようにnamed_scopeはFind.allなので、配列が返ります。1件だしと思って下のように書くと失敗します。
lambda{|id1, id2|{:conditions => ["user_id = ? AND friend_id = ?",id1,id2 ]}} friend = Friend.match(1,2) p friend.name → ひっかかる 正しくは以下の形。 frind = Friend.match(1,2).first 本当はミスを避けるためにnamed_scope内にfirstを入れられるのがいいんだけど、できないっぽい?軽くググッて調べたけどやり方が見つからなかったので、当座はこれで凌ぎます。 Actionを実行したときにViewで何も表示しない方法
2010.10.08 Friday
コントローラーにhogehogeというアクションを作って、ビューからそれを実行したりすると、下のようなエラーメッセージが出てしまうことがあります。 ActionView::MissingTemplate (Missing template main/hogehoge.erb in view path app/views): アクションを呼び出したいだけで、ビューには何も変更はないんだけれど、hogehogeアクションのビューを探して見つからなかったって感じ。 そんな時には、アクション内に「何も表示しませんよ」と書いてあげればOKでした。 render :nothing => true respond_toでいくつかのrenderをまとめて書くときはこんなんで。 respond_to do |format| format.html { render :nothing => true } end Railsでリンクをクリックすると表示/非表示切り替わるやつを作る
2010.09.16 Thursday
Rubyのコード内ではJavaScript直接書かなくてすむならできるだけ書かず、Rubyコードっぽくしておきたいです。 正式な機能名があるのかどうか知りませんが、こうリンクをクリックするとその下の説明文が開いたり閉じたりして表示/非表示できるやつ。あれをlink_to_functionでやる方法を調べたのでメモっておきます。 すべてviewの中の記述です。 <dl> <dt><%= link_to_function('質問1') {|page| page[:question1].toggle()} %></dt> <dd style="display: none;" id="question1">答え1</dd> <dt><%= link_to_function('質問2') {|page| page[:question2].toggle()} %></dt> <dd style="display: none;" id="question2">答え2</dd> </dl> link_to_functionはリンクにJavaScriptの機能をつけるときに使います。onClickとか。 質問1をクリックすると、答え1が開いて見えるようになります。 {|page| page[:hogehoge].toggle()}部分はコピペでOK。 hogehoge部分を、表示/非表示切り替えたい要素のidにします。 ここではddを使ってるけど、divとか他のものでも大丈夫。 あと、デフォルトでCSS、display: noneをつけているのでこの場合は最初閉じた状態でリンクをクリックすると開くけど、display: noneを入れなければ最初開いた状態で、クリックすると閉じます。 いずれの場合もクリックするたびに開いたり閉じたり。 toggleをshowとかhideにすると、押すたびに切り替わりでなくて、showするだけかhideするだけの似たようなのが作れます。状況に応じて使い分ければいいかな。 メールへのハイパーリンク
2010.08.05 Thursday
メールへのリンクを作るヘルパーメソッドの覚書。 <%= mail_to "xxx@xxxxxxxx", "メールアドレス", :cc => "", :bcc => "", :subject => "", :body => "" %> オプションとしてccとか入れられるみたい。 HTMLヘルパーで「前のページに戻る」
2010.03.11 Thursday
「前のページに戻る」のリンクを作るには以下の一文でOK。 <%= link_to_function t("Back"), "history.back()" %> JavaScriptの onclick='history.back();' と同じです。 |
Rails3レシピブック 190の技
ついにRails3対応版が出ました!!
WEB+DB PRESS Vol.58
Rails2系から3への移行時に知りたいことがひとまとまりになっててよかった!色々ググるよりこれを読む方が早い。
Rubyレシピブック 第3版 303の技
Rubyやるならこのリファレンスは必要。
Search this site
|