トップページphp
1001コメント336KB

【Ruby】Ruby on Rails Part6

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん2008/10/24(金) 17:46:53ID:???
■前 Ruby on Rails のスレ が
http://pc11.2ch.net/test/read.cgi/php/1207425569/

■参考サイト
<英語>
本家:http://www.rubyonrails.org
API document:http://api.rubyonrails.com/
開発者のblog:http://weblog.rubyonrails.org/
参考wiki:http://wiki.rubyonrails.org/rails

<日本語>
Rails' wiki: http://wiki.fdiary.net/rails/

■参考スレ
Rubyについて Part 33
http://pc11.2ch.net/test/read.cgi/tech/1223709050/
Ruby 初心者スレッド Part 22
http://pc11.2ch.net/test/read.cgi/tech/1221467121/
08818532009/04/07(火) 12:18:13ID:???
>>880 でいけたと思ったのですが、やはり駄目でした。
日本語が ・・・・・・・ と点で表示されてしまうようです。

また、いろいろ試してみます。それでは失礼します。
0882nobodyさん2009/04/07(火) 12:29:06ID:???
そりゃフォントのせいだけどな
08838642009/04/07(火) 15:53:52ID:???
>>877-879
いえいえ、ありがとうございましたw
0884nobodyさん2009/04/07(火) 20:33:42ID:???
>>868-870
ありがとうございました。
to_dateはクリアできました。

で、今配列に{Sun, 19 Apr 2009=>[], Fri, 10 Apr 2009=>[],…}
ってな具合に1月分date型で入ってるんだけど
Tue, 07 Apr 2009 ←今日の日付
とinclude?するとfalseになる。
=>[]があるからfalseになるのかな?
include?って完全一致?
0885nobodyさん2009/04/07(火) 21:01:55ID:???
irb -rubygems -ractive_support --prompt=simple
>> days = (('2009-04-01'.to_date)..('2009-04-30'.to_date)).inject({}){|h,d| h.merge(d=>[])}; nil
>> days.include?('2009-4-7'.to_date)
=> true
08868542009/04/08(水) 13:05:31ID:yKX835d9
<%= link_to nil, :controller => 'cups', :action => :show, :id => params[:id], :only_path => false %>
これでいけました!レスくださった方々ありがとうございましたm(_ _)m
08878532009/04/08(水) 14:17:09ID:???
結局、rspecでコマンドプロンプトの時だけ、STDOUTで文字が出る前にSJISに変換してしまうことにしました。
半分あきらめに近いですが、SJISの範囲内ならまあいいということで…

例としては、spec_helper.rb(rspecで共通で読み込むルーチン)に以下を追加します。

require 'kconv'
if ENV['OS'] =~ /Windows/i && ENV['TERM'].nil?
  class StdoutHook
    def write(str)
      #    STDOUT.write str.to_s.kconv(Kconv::SJIS,  Kconv::UTF8)
      STDOUT.write str.to_s.tosjis
    end
    $> = new
  end
end

STDOUT乗っ取り?はMLの過去ログを参考にしましたが、もっといい方法があれば捕捉お願いします。
[ruby-list:45331] Re: Windows コマンドプロンプトで UTF-8を出力するには
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/45331
08888532009/04/08(水) 14:46:23ID:???
>>887 修正
---- spec_helper.rb への追加コード ----

# only command prompt at Windows
if ENV['OS'] =~ /Windows/i && ENV['TERM'].nil?
  require 'kconv'
  unless defined?(STDOUT.old_write_for_cmd)
    class << STDOUT
      alias :old_write_for_cmd :write
      # override STDOUT.write
      def write(str)
        # old_write_for_cmd str.to_s.kconv(Kconv::SJIS,  Kconv::UTF8)
        old_write_for_cmd str.to_s.tosjis
      end
    end
  end
end
0889nobodyさん2009/04/08(水) 16:29:28ID:???
rails のルートディレクトリを取得できるヘルパーなりはありませんか?

現在は File.dirname(__FILE__) + "/../log" とかやっているのですが、
RAILS_ROOT + "/log" とかできるといいなーと。
0890nobodyさん2009/04/08(水) 17:25:39ID:???
rails で便利な collection_select を、
rails 以外のふるーいアプリで使いたいのですが、

$ cat test.rb
require 'action_view'
collection_select(...)
$ ruby test.rb

としても undefined method `collection_select' なんて言われます。

ActionView.Helpers.FormOptionsHelper.collection_select(...

にした場合は undefined method `Helpers' for ActionView:Module と。

どうすれば rails 以外から collection_select が使えるようになりますか?
0891nobodyさん2009/04/08(水) 20:49:56ID:???
>>889
自分で試してみたの?
普通にRAILS_ROOT使えるよ。
0892nobodyさん2009/04/08(水) 21:33:38ID:???
最近は Rails.root (Rails.env とか Rails.loggerもあるよ!)
0893nobodyさん2009/04/08(水) 22:18:15ID:???
>>892
お、それは初めて知った。
今試してみたら、Rails.rootはPathnameで返って来るんだね(RAILS_ROOTはString)。
0894nobodyさん2009/04/09(木) 00:12:20ID:Hon6X4Il
>>592
現に使われている以上、負け犬の遠吠えに他ならないレスだな
http://www.grails.org/Testimonials
08958532009/04/09(木) 01:42:24ID:???
>>888 なんですが、require "win32/console/ANSI" が絡むと(+ rspecオプションで--colur)、
文字化けしまくりで、
直すのやっかいそう&そろそろrails関係なさげなので、本スレの方に行ってきます。
0896nobodyさん2009/04/09(木) 10:06:46ID:8toP/BB5
2.2.2 で gettext で動かせてる人っています?
もしいたらバージョンと設定方法教えてもらえないでしょうか・・・。
0897nobodyさん2009/04/09(木) 10:55:54ID:???
2.2.2では、Rails標準のi18n使った。
その頃gettextは対応してなかったので。
gettext 2.0.0 出たし、いまはどうか分からないな。
08988962009/04/10(金) 00:58:01ID:???
>>897
レスありがとうございます。
やっぱり無理なんですかね・・・。
公式に「無理!」って情報とかってあったりするんでしょうかね・・・。

ちなみに、i18n を使う場合、メールの iso-2022-jp 周りとかってやっぱり自前になるんですか?
0899nobodyさん2009/04/10(金) 08:58:13ID:4tZH5Ujq
そうなるね。
でも、iso-2022-jpで送信する方法は検索すればすぐ見つかるから苦労しないと思う。
0900nobodyさん2009/04/10(金) 10:03:18ID:???
iso-2022-jp の場合、日本語の添付ファイルが化けるけど、
RFC 違反だけど、多くのメーラで文字化けしない方法ってあるよね?
その ruby 版のコードってどこにありますか?><
0901nobodyさん2009/04/10(金) 11:29:23ID:???
rails _2.3.2_ add して
ttp://code.nanigac.com/source/wiki/view_title/641/%E8%B6%B3%E3%81%97%E7%AE%97
をコピペして勉強してます。

値を入れずにボタンを押すと

undefined method `self_and_descendants_from_active_record' for Add:Class

が出ます。ググると
ttp://jijixi.azito.com/cgi-bin/diary/index.rb?date=20090317#p02
があったので、app/controllers/add_controller.rb に

def self_and_descendants_from_active_record
 self_and_descendants_from_active_record
end

としてエイリアス?を用意しても変わらず。どうすれば解決するでしょうか。
0902nobodyさん2009/04/10(金) 12:17:16ID:???
それコントローラーのメソッドなのか?モデルじゃなくて?
0903nobodyさん2009/04/10(金) 13:02:54ID:???
activerecord-2.3.2/lib/active_record/base.rb にあるものだけど、2.3.2 になってスペルミスが修正されたみたいなのです。
09048532009/04/10(金) 14:04:46ID:???
>>888
・win32/console/ANSIのせいで、rspecオプションに--colourつけると文字化けする
 (というかstdout.writeを上書きできてない)のを修正した。
・UTF-8→SJISの変換の際に、Kconv.tosjis使うと半角カタカナが全角になったり、
 MIMEが変換されたりするのを防止するためにnkf使うように修正

---- spec_helper.rb への追加コード ----

require "nkf"

# convert $stdout to sjis for command prompt at Windows
if !defined?($stdout.old_write_for_sjis_filter) &&
RUBY_PLATFORM =~ /win32/ && ENV['TERM'].nil?
class << $stdout
alias :old_write_for_sjis_filter :write
def write(str)
# change to sjis AS IS
old_write_for_sjis_filter NKF.nkf('-sxm0', str.to_s)
end
end
# puts "overrode $stdout.write"
end

何回もうざくてゴメン。たぶんこれで最後です。
09058532009/04/10(金) 14:05:38ID:???
>>904
ぎゃーインデント崩れた。うざいのでそろそろブログの方に書きます

require "nkf"

# convert $stdout to sjis only command prompt at Windows
if !defined?($stdout.old_write_for_sjis_filter) &&
    RUBY_PLATFORM =~ /win32/ && ENV['TERM'].nil?
  class << $stdout
    alias :old_write_for_sjis_filter :write
    def write(str)
      # change to sjis AS IS
      old_write_for_sjis_filter NKF.nkf('-sxm0', str.to_s)
    end
  end
#  puts "overrode $stdout.write"
end
0906nobodyさん2009/04/10(金) 21:19:22ID:???
sjisのテキストファイルの添付なら、変換せずにbase64とかで包んで添付したほうが良い。
oeとかがどうやってるか、ちゃんと生メールを見て同じように処理するのが問題が少ない。
基本的に、文字の入力はjisで行わせて無変換で送るようにしたほうが文字化けを回避できる。
最悪、utfで統一でも支障はない。

http://pc12.2ch.net/test/read.cgi/tech/1230466044/
ネットワークプログラミング相談室 Port23
http://pc12.2ch.net/test/read.cgi/tech/1235800707/
ネットワークプログラミング雑談
0907nobodyさん2009/04/11(土) 00:35:00ID:???
>>901
たぶんActiveForm使ってる?
2.2から国際化の仕組みが入ってて、そのままだとエラーになるみたい。
自分はActiveFormのコードを修正して対応したよ、以下参考に。。。

active_form.rb
class << self # 51行目くらいの所に下のコード追加
def self_and_descendants_from_active_record
[self]
end
def human_name(*args)
name.humanize
end
end

もしくはここから新しいやつ落としたほうがいいかな・・・。
ttp://github.com/cs/active_form/tree/master
0908nobodyさん2009/04/11(土) 06:28:01ID:???
MerbアプリをGoogle App Engineで動かしました - Hello, world! - s21g
http://blog.s21g.com/articles/1418

JRuby + RailsもGoogle App Engineで動くんじゃね?

0909nobodyさん2009/04/11(土) 12:04:21ID:???
いやもう動かしてる人いるし。その記事より前に。
0910nobodyさん2009/04/11(土) 13:01:50ID:???
>>909
kwsk
0911nobodyさん2009/04/11(土) 13:37:10ID:???
直接Railsが動くようにしてほしいのだが。Amazonはできるのに。
0912nobodyさん2009/04/11(土) 17:57:50ID:???
802 名前:nobodyさん[sage] 投稿日:2009/04/11(土) 15:06:07 ID:???
JRuby on Railsも動いたみたいだね。
JRuby on Rails on Google App Engine勝手訳 - ずっと君のターン
http://d.hatena.ne.jp/technohippy/20090408/1239196300

せっかくのActiveRecord(O/Rマッパ)使えないからつらそうだけど
0913nobodyさん2009/04/12(日) 12:14:31ID:???
Rails 2.3からリクエストの結果がキャッシュされるようになりましたが
このキャッシュを特定のアクションでキャッシュさせない事はできるでしょうか。

Ajaxのリクエストがキャッシュされ、
前回実行時の結果がレンダリングされてしまうのを防ぎたいのですが。
0914nobodyさん2009/04/12(日) 12:42:56ID:???
Ajaxのリクエストってよく分からんのだが。
Javascriptで描画した内容が元に戻るってこと?
0915nobodyさん2009/04/12(日) 15:56:54ID:???
CSS同様、ブラウザの実装次第じゃないの?
0916nobodyさん2009/04/12(日) 16:59:20ID:???
>>913
>Rails 2.3からリクエストの結果がキャッシュされるようになりましたが

こういう認識に至ったのはどういう訳で?
09179132009/04/12(日) 22:23:27ID:???
>>916
Rails2.3のリリースノートです。

5.8 Improved Caching Performance
Rails now keeps a per-request local cache of read from the remote
cache stores, cutting down on unnecessary reads and leading to better
site performance. While this work was originally limited to
MemCacheStore, it is available to any remote store than implements
the required methods.

実際にどういう箇所で問題が起きているかというと、モーダルです。

1. モーダルをAjaxで開く
2. モーダル内で何か操作を実行(モーダル内のHTMLがAjaxで書き換えられる)。
3. モーダルを閉じる
4. モーダルを再び開くと、2.の結果がそのまま表示される

という状態です。

こちらとしては、モーダルを開いたら初期状態でモーダルの内容が
表示されて欲しい訳です。
Rails2.2まではその通りの動作でした。
しかし、Rails2.3に上げた所、
モーダル操作後の結果がキャッシュされるようになってしまいました。

4. の再びモーダルを開く際には、モーダルが開いてもコンソールログは出ません。
なのでリクエスト自体がキャッシュされていると思います。
09189132009/04/12(日) 22:33:52ID:???
ブラウザはFirefoxとSafariで試してみました。

少し自分で2.3.2のソースを読んでみようと思います。
お騒がせしました。
0919nobodyさん2009/04/12(日) 22:42:03ID:???
本当にリクエストをうってるかを確かめる方が先なのでは。
キャッシュされているというのは推測みたいだし。
Parosとかのパーソナルファイアーウォールを使えばリクエストもレスポンスもキャッチできる。
0920nobodyさん2009/04/12(日) 22:43:11ID:???
パーソナルファイアーウォール

ローカルプロキシ

間違えた・・・
0921nobodyさん2009/04/13(月) 01:17:43ID:???
local cache storeとremote cache storeって何だろう。
remoet cache storeの例にMemCacheStoreが挙げられているから、
localってのはRails Framework側で持ってるcache storeのことなのかな。
0922nobodyさん2009/04/13(月) 03:33:44ID:Mmo44XLB
link_toをモデルクラスで使いたいのですが、どうすればいいでしょうか??
そもそもモデルクラスでlink_to使おうとするのは邪道でしょうか?
教えていただけると幸いです。
0923nobodyさん2009/04/13(月) 06:44:46ID:???
http://slashdot.jp/developers/09/04/10/0421223.shtml
0924nobodyさん2009/04/13(月) 07:48:49ID:???
>>923
タイトルくらい貼ろうぜ

Twitter、Ruby on RailsからScalaへ - スラッシュドット・ジャパン
http://slashdot.jp/developers/09/04/10/0421223.shtml

Twitter は Ruby on Rails で構築されたそのインフラを徐々に Scala に置き換えているそうだ (Technology Review の記事, 本家 /. 記事) 。
Twitter ではフロントエンド、バックエンド共に Ruby on Rails が使われていたが、
最近では大量のメッセージを処理できず「Fail Whale」出現の原因となったりしていた。
このため Twitter の開発チームは代替言語として Scala を採用、少しずつバックエンドや
インフラを Scala に置き換えているそうだ。スイス連邦工科大学ローザンヌ校の
Martin Odersky 氏によって開発された比較的新しいプログラミング言語である Scala は
並列プロセスの処理に長けている点が Twitter に向いており、
また言語としてのフレキシビリティも開発にとっては魅力とのこと。
短所としては、機能も多く、シンタックスも見慣れた感じでは無いため習得が簡単ではないことと、
新しい言語であるため実績がまだ少ないことだという。
それでもTwitterでは多くのテストケースを成功させており、Scala の方がメリットが多いと考えているようだ。

開発チームはフロントエンドは Ruby on Rails のまま、
年内には API リクエストの一連の処理を Scala で行えるようにしたいとしている。
0925nobodyさん2009/04/13(月) 08:37:28ID:???
こっちにはまだ貼られてなかったのか。
0926nobodyさん2009/04/13(月) 10:33:52ID:???
MQ の部分でしょ。Scala でも Erlang でもご自由にとしか。
あと、計算なら C でもいいし。

フロント部分が Scala/C はありえんけど。

言語は使い分け。
0927nobodyさん2009/04/13(月) 11:40:40ID:???
まえ初心者スレだったかに、一つのシステムに複数言語を使う仮定を書いたが、
そんなケースはほとんどないとか言われたな。そういう考えのやつも多いのだろう。
0928nobodyさん2009/04/13(月) 19:37:14ID:???
どっかにフロントエンドもscalaに置き換えつつあるとか書いてあったな
そのうちscalaフレームワーク公開してくるかもな。

>フロント部分が Scala/C はありえんけど。
CはともかくScalaはrubyと比べても良い言語だし、ありえないことは無い。
0929nobodyさん2009/04/13(月) 20:45:25ID:???
migrationで、mysqlでいう
add column after hoge
をやりたいのですが、afterに相当する機能がないっぽいです。クエリべたっと書けばできますが、スマートな方法はないでしょうか?
0930nobodyさん2009/04/13(月) 21:34:04ID:???
>>929
特定のDBMSに依存する処理は素直にSQL書くのがスマートだと思うよ。
add column afterがDBMSとして一般的な機能でRailsがサポートしていないなら
プラグインを作る価値はあると思うんだけど、MySQLだけとかだったら
やっぱり直接SQLを書いたほうが誰が見ても分かりやすい。
0931nobodyさん2009/04/13(月) 22:23:22ID:???
mysqlを理解してればの前提付きだな。
抽象化したほうが、DB変わった場合の環境でも手直しは少ないと思うけどな。
0932nobodyさん2009/04/16(木) 02:18:06ID:???
db変わるという前提付きだな。
損の方が多い。
0933nobodyさん2009/04/16(木) 10:11:07ID:???
DB変わるより言語変わる可能性の方が普通はるかに高いからね
0934nobodyさん2009/04/16(木) 19:02:58ID:RLOaA3va
質問なんですが、
/aaa/30000/bbb/ccc
というURLにリクエストが来たとき、
30000というidを取得しつつ、
aaaコントローラのbbb_cccアクションが呼ばれるようにしたいのですが、そういったことは可能でしょうか??

0935nobodyさん2009/04/16(木) 19:42:35ID:???
Rails 2.1.1 で初めて Rails をやりはじめました。
「Rails によるアジャイル〜第二版」を読みながらやっているのですが、さっそくはまった。

1. rails depot
2. (DB作成)
3. nruby script/generate model product
4. rake db:migrate
5. ruby script/generate controller admin

ここまで実行し、本のP.62 の通り、admin_controller.rb において

class AdminController < ApplicationController
 scaffold :product
end

と修正して、mongrel を立ち上げてブラウザで
http://localhost:3000/admin にアクセスしたのだけど、

NoMethodError in AdminController#index

と出る。products テーブルの CRUD 画面が出ないのですが、
どうしたらいいのでしょうか。

http://d.hatena.ne.jp/idesaku/20071211/1197386955
にあるように、以下のようにやらないといけないのですか?
ruby script/generate scaffold モデル名 テーブルにあるカラム

すでに 上記 3. と 4. で、空のモデルクラスとテーブルは出来ているので、
AdminController を直すだけには出来ないのでしょうか?
0936nobodyさん2009/04/16(木) 19:47:12ID:???
indexメソッドを追加すればいいじゃん
09379352009/04/16(木) 19:57:36ID:???
>>936
def index を追加し、app/views/admin/index.html.erb を作成すれば、
ブラウザでアクセスすれば、ページが表示されますが、それは CRUD 画面ではなく、
本の第4章の、Hello, Rails と同じですよね。

>>935 で示した hatena と同じように、別モデル(person)を
ruby script/generate scaffold person .....
としたら、自動生成された people_controller.rb には、結構な量のソースが生成されたのだけど、
Rails 2.0 からは、コントローラに scaffold と1行書けばよい、というやり方は廃止になった、ということ?
0938nobodyさん2009/04/16(木) 21:01:57ID:???
その本の第4章は知らんがな。。。

Railsは変化が激しいから本と違うバージョンでやらない方がいいと思うよ。
1.2からはスキャフォールド生成の手順からして変わってる。
0939nobodyさん2009/04/16(木) 21:03:03ID:???
「1.2からは」じゃなくて「1.2とは」だ
0940nobodyさん2009/04/16(木) 21:37:52ID:???
これかな?
http://yoshitan.blog6.fc2.com/blog-entry-194.html

1.2系とはちょこちょこ変わっているので2.x系の手順でできているなら、些末なところには拘らない方がいいと思う
最悪active_scaffoldでも代替できるしね
0941nobodyさん2009/04/17(金) 00:36:24ID:???
不要なHTMLのタグ隠蔽する方法教えて
ソースから見せたくないのだ
0942nobodyさん2009/04/17(金) 00:52:39ID:???
delキー押せばいいんじゃない
0943nobodyさん2009/04/17(金) 01:01:29ID:???
なんかここのところ、
質問してはその後まったくレスのないやつが多いな
0944nobodyさん2009/04/17(金) 01:55:27ID:???
質問の仕方や日本語の使い方から察するにかなり若い連中なんだろうと思ってる
09459352009/04/17(金) 02:31:23ID:???
>>940
レスどうもありがとうございます。
底や別のページを見て、Rails 1.2 系が持っていた scaffold 機能は 2.0 系でなくなったと理解しました。
scaffolding や ActiveScaffold を入れれば 2.0 でも1.2 系のことが出来るそうですが、
ややこしいので、ひとまず 別環境に Rails 1.2.6 を入れて、そっちで勉強することにしました。

もう一つグチ。「Rails によるアジャイル〜」の本で、(正確なページ数は忘れたが) P62 ページの後、
足りないカラム(price カラム)を足す演習がありますが、
Rails 1.2 系だと、rake db:migrate でカラム出すだけで、scaffold の画面をリロードするだけで
増えたカラムが画面に反映されるが、
Rails 2.0 で、>>935 に書いた
$ ruby script/generate scaffold モデル名
を再度実行しても、そもそも Contoroller や views/admin 以下の *.html.erb に
CRUD を行う HTML がべた書きされてしまっているため、増えたカラムが反映されない。
結局テーブルをドロップして、scaffold をやり直した。

どうして Rails 2.0 系は scaffold を廃止したのだろう?


といいつつ、よほどイントラ向けでユーザもうるさくない場合以外は、
業務ではscaffold なままの web アプリは使わない、と同僚からツッコミがあった。
0946nobodyさん2009/04/17(金) 08:44:46ID:???
>>941
<% if false %>
 見せたくない箇所
<% end %>
0947nobodyさん2009/04/17(金) 14:31:56ID:???
どうせ漏れる時は漏れる。埋め込み言語の宿命。
0948nobodyさん2009/04/17(金) 15:03:11ID:???
漏れても大丈夫。多い日でも安心。
0949nobodyさん2009/04/17(金) 21:21:58ID:???
RoRサイトも踏み台だな。
0950nobodyさん2009/04/17(金) 22:57:15ID:???
>>945
自分もRailsに慣れるとscaffoldは使わない事が多くなってくるので、
scaffoldに固執しないほうがいいと思う。

基本的な流れというか使い方を覚えたら、
最新版のRailsで何か作るほうがいいんじゃないかな。
当然、バージョンが違う事で詰まる部分があるんだけど
ググったり、このスレで聞いたりすればなんとかなる。
0951nobodyさん2009/04/18(土) 01:28:25ID:???
scaffoldって、コントローラに scaffold と書くと使えるようになるscaffoldと
generateで作るやつがあるが、後者は2系でも普通にある。こっちはRESTful
なリソースを公開しようとすると、なんだかんだ言って基本的な骨組みは
scaffoldのものが使えたりする。
09529342009/04/19(日) 20:26:48ID:GcnrJHDf
>>934 分かる方いらっしゃましたらご教示頂けると幸いです><
0953nobodyさん2009/04/19(日) 21:43:31ID:???
>>952
map.connect ':controller/:id/bbb/ccc', :action => 'bbb_ccc'

0954nobodyさん2009/04/19(日) 21:44:38ID:???
書いてから思ったが、そういうのがaaa限定なら変にいろいろ受け付けるようにせず
map.connect 'aaa/:id/bbb/ccc', :controller => 'aaa', :action => 'bbb_ccc'
のほうがいいか。

09559522009/04/20(月) 01:59:43ID:PwSyAV4m
>>954 でいけました!ありがとうございましたm(_ _)m
0956nobodyさん2009/04/20(月) 10:04:09ID:???
質問です。

あるページにジャンプする際に、非ログイン状態だと403を返すようにしたいのですが、
これはどこにコードを記述するべきでしょうか?
0957nobodyさん2009/04/20(月) 14:25:50ID:???
コントローラだろjk
restful authenticationつかってない?
0958nobodyさん2009/04/24(金) 20:51:26ID:/YVXcJLc
すいません質問させてください。
(User.find 133).friends(:all, :conditions => ["age = ?", 20])
こんな感じのことをしたいのですが、どうすればいいでしょうか。
(.friendsでは配列が返ってくる・・)
なんかうまい書き方があったら教えていただけると幸いです><
0959nobodyさん2009/04/24(金) 21:08:16ID:???
User.find(133).friends.find_all_by_age(20)
0960nobodyさん2009/04/24(金) 21:37:48ID:???
多用するならnamed_scopeで見易く。

class Friend < AR::Base
named_scope :of_age, lambda {|age| { :conditions => [ 'age = ?', age ] } }
end

User.find(1333).friends.of_age(20)
0961nobodyさん2009/04/24(金) 22:21:15ID:???
ActiveRecord で質問です。
:conditions に ハッシュを渡せば 各キーが AND で結合されますが、

product = Product.find(:all,
 :conditions => {
 :price => 1000,
 :kubun => [6, 7, 8]}
)
select * from products where price = 1000 and kubun in (6, 7, 8)

key > value とかはできまませんか?
以下のような(在庫数が 10 以上 20 以下)SQL を実行させる Ruby コードを書きたいです。
10..20 として between を使いたいところですが、画面側で 10以上 だけしか指定されない場合があるため、使えません。

select * from products where price = 1000 and kubun in (6, 7, 8) and zaiko > 10 and zaiko < 20
0962nobodyさん2009/04/24(金) 22:38:10ID:???
conditions = 'price = ? AND kubun in (?) AND zaiko > ?'
args = [ 1000, [6,7,8, 10] ]

if upper
conditions += ' AND zaiko < ?'
args << upper
end

find(:all, :conditions => [ conditions, *args ])

0963nobodyさん2009/04/24(金) 22:38:51ID:???
10まで中に入れてしまった。察っして。
0964nobodyさん2009/04/24(金) 22:55:22ID:???
レスどうもありがとうございます。

やはり :conditions にハッシュを渡す方法じゃなく、
:conditoins => 配列 のやり方
(配列の第一要素が SQL の文字列、第二要素以降がバインド変数のパラメータ)
じゃないとできないですか。

その方法でやってみます。
0965nobodyさん2009/04/24(金) 23:32:47ID:???
あまりありがたみはないが
:conditions => [ 'price = :p', { :p => 1000 } ] とも書けるな。
0966nobodyさん2009/04/25(土) 00:01:47ID:???
web側で入力項目が15コぐらいあり、それがセッションに入っている。
その15コがそのまま SQL のパラメータになるんだけど、session オブジェクトをそのまま ActiveRecord のモデルのメソッドに
渡してもよい?

それとも何か Condition クラスを作り、そこに詰めてからモデルに渡すべき?

Java 的発想だと、Http 層を 永続化層に持って行くのはよくないので、なんらかのオブジェクトに詰め直してから
渡しますが、Rails でもそうしたほうがいいでしょうか。

session はハッシュなので、そのハッシュから部分的なハッシュを作り直し、ハッシュ渡しにしようかと思いましたが、
入力項目が多いので、抜けがあると間違いの元なので、単独の Condition クラスを定義しようと思っています。
0967nobodyさん2009/04/25(土) 07:37:56ID:???
セッションがWeb上で取得したパラメータをそのまま持つよりは、
最初からConditionオブジェクトに詰めて永続化しておき、Sessionでは
参照キーだけを持っておくという形にする気がする。
0968nobodyさん2009/04/25(土) 13:09:16ID:???
そのまんま入れてます。
Railsでは詰めなおしてもあまり意味ないかも。
入力項目のチェックはActiveRecordがするんだし。
0969nobodyさん2009/04/25(土) 13:27:35ID:???
rspec-rrとか使っている人いない?
標準のrspecとmock、stubとどう違ってくるんでしょ
0970nobodyさん2009/04/25(土) 16:44:24ID:???
そのなんらかのオブジェクトがRailsでいうモデルだろ
テーブルとモデルを1:1で紐づけるのがactive recordパターン
テーブルとモデルをn:nで紐づけるのがdata mapperパターン
Webはフォームの入力項目 ≒ テーブルなのでactive recordパターンが広く使われている
なので、sessionでもつハッシュの構造はDBにあわせた方がベター
それができない場合は、モデルにハッシュ構造の変換処理を書くのが作法
ARにもバリューオブジェクトあるけど、ちょっと用途が違う気がする
0971nobodyさん2009/04/25(土) 23:25:28ID:???
>>966
凝った検証処理が必要ないなら Hash#assert_valid_keys でチェックしてから Hash#slice で切り出して渡すかな。
0972nobodyさん2009/04/26(日) 05:03:44ID:???
お前ら rails でファイルアップロード用のファイル管理ライブラリとかプラグインてないんでしょうか?
アップロードした画像をリサイズしてくれたり、ファイル一覧をサムネイルで表示してくれたり、
選んだの削除できたり
そういうステキなのキボン
0973nobodyさん2009/04/26(日) 14:44:10ID:ZTlDJFDt
>>972
作ってくだ(ry
09749662009/04/26(日) 18:58:31ID:???
みなさまレスどうもありがとうございます。
結論としては、session オブジェクトをモデルのメソッドに渡すのをやめ、
新規に condition オブジェクトを作ることにしました。

>>970
今回のケースでは、
画面の入力項目はそのまま SQL のパラメータになるけど、モデル(テーブル)の属性にはならないのです。
>>961 (これも自分なのだが) のように、商品マスタの price が ○円以上○円以下で、kubun が■or■で・・・・といった条件が延々と並ぶ。
だからモデルクラスはそのまま使えませんでした。

>>971
ruby リファレンスマニュアルの hash をみたところ、assert_valid_keys や slice というメソッドはありませんでした。
これは自分で特異メソッドとして定義せよ、ということ?
0975nobodyさん2009/04/26(日) 19:04:34ID:???
なぜRailsのリファレンスも見ないのよ?
http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Hash/Keys.html#M001164
0976nobodyさん2009/04/27(月) 16:33:28ID:ty2d5Btl
>>959
>>960
ありがとうございますm(_ _)m

すいません他にも質問したいことができました。

if true
User.friends
elseif
User.parents
else
User.childern
end

のような処理をしたいとき、
User.xxx のxxxの部分を変数みたいにして、条件分岐なしで一行で書くことはできないでしょうか??

ご教示いただけると幸いです。
0977nobodyさん2009/04/27(月) 20:17:33ID:ty2d5Btl
すいません分かりにくかったかもしれないと思ったので書き直します・・

if x='friends'
User.friends
elseif x='pearents'
User.parents
else x='children'
User.childern
end

を一行で書けないか・・みたいな感じです。
0978nobodyさん2009/04/27(月) 20:24:34ID:???
User.send(x)
0979nobodyさん2009/04/27(月) 20:26:28ID:???
> 977
User.method(x).call
0980nobodyさん2009/04/28(火) 00:13:18ID:???
すみません、知恵を貸してください。

現在、items(仮)というテーブル(id, name)からnameを条件にレコードを検索し、
will_paginateを使用して表示している機能があります。

その機能を、検索条件との「完全一致」「前方一致」「部分一致」の順に並び替えたいのですが、
なにかいい方法はないでしょうか…?

複雑なSQLを書けばいけるとは思いますが、何か他に方法がないか模索してします。


レス数が950を超えています。1000を超えると書き込みができなくなります。