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

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

posted by スポンサードリンク | | - | - | - |はてなブックマーク - スポンサーサイト
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を使うときの罠
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って便利
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のオプションに配列を使う
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内で条件分岐する
ラジオボタンをクリックするとアクションを呼ぶようにする
フォームを監視して選択された内容によってアクションを読んだり、ページ内の一部を更新したりするのはobserve_fieldでできるけれど、
こっちの方が実際のボタンのコードのところに置けるのでいいなと思ったのでメモ。

View
<%= f.radio_button :type, 'hoge',
  { :onclick => remote_function(:update => "total", :url =>{ :action => 'total_number'}, :submit => :user) } %>

<span id="total><%= render :partial => 'total' %>&lt;/span>
・このラジオボタンを選択したときに、total_numberアクションが呼ばれる。
: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つしかできないのはちょっと不便しょんぼり
posted by トモト | 15:17 | Rails小ネタ | comments(0) | trackbacks(0) |はてなブックマーク - ラジオボタンをクリックするとアクションを呼ぶようにする
named_scopeで検索結果が1件の場合
毎回Find使って検索するのが面倒なのでnamed_scope大好きなんだけれど、 named_scopeはFind :allだということを忘れて、
結果が1件だけ返るときによく書き方を間違えてバグらせるのでメモ。

たとえばマイミクみたいな感じでユーザー同士をFriendsとして登録するFriendsモデルがあったとして。
以下のようにAさんとBさんのIDを入れて一致したデータを取り出すようなnamed_scopeを作りました。
named_scope :match,
    lambda{|id1, id2|{:conditions => ["user_id = ? AND friend_id = ?",id1,id2 ]}}
最初に書いたようにnamed_scopeはFind.allなので、配列が返ります。1件だしと思って下のように書くと失敗します。
friend = Friend.match(1,2)
p friend.name  → ひっかかる

正しくは以下の形。
frind = Friend.match(1,2).first
本当はミスを避けるためにnamed_scope内にfirstを入れられるのがいいんだけど、できないっぽい?
軽くググッて調べたけどやり方が見つからなかったので、当座はこれで凌ぎます。
posted by トモト | 15:32 | Rails小ネタ | comments(0) | trackbacks(0) |はてなブックマーク - named_scopeで検索結果が1件の場合
Actionを実行したときにViewで何も表示しない方法
コントローラーに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
posted by トモト | 13:58 | Rails小ネタ | comments(0) | trackbacks(0) |はてなブックマーク - Actionを実行したときにViewで何も表示しない方法
Railsでリンクをクリックすると表示/非表示切り替わるやつを作る
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するだけの似たようなのが作れます。状況に応じて使い分ければいいかな。
posted by トモト | 16:55 | Rails小ネタ | comments(0) | trackbacks(0) |はてなブックマーク - Railsでリンクをクリックすると表示/非表示切り替わるやつを作る
メールへのハイパーリンク
メールへのリンクを作るヘルパーメソッドの覚書。

<%= mail_to "xxx@xxxxxxxx", "メールアドレス", :cc => "", :bcc => "", :subject => "", :body => "" %>


オプションとしてccとか入れられるみたい。
posted by トモト | 16:12 | Rails小ネタ | comments(0) | trackbacks(0) |はてなブックマーク - メールへのハイパーリンク
HTMLヘルパーで「前のページに戻る」
「前のページに戻る」のリンクを作るには以下の一文でOK。
<%= link_to_function t("Back"), "history.back()" %>


JavaScriptの
onclick='history.back();'

と同じです。
posted by トモト | 18:17 | Rails小ネタ | comments(0) | trackbacks(0) |はてなブックマーク - HTMLヘルパーで「前のページに戻る」
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