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

【Ruby】Ruby on Rails Part9

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2010/02/19(金) 16:13:13ID:SpWtnpr8
■前
【Ruby】Ruby on Rails Part8
http://pc11.2ch.net/test/read.cgi/php/1252842574/

■参考サイト
<英語>
本家: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/
0002nobodyさん2010/02/19(金) 16:14:34ID:WbFNhWFy
■変遷
【Agile】Ruby on rails相談所【DRY】
http://pc8.2ch.net/test/read.cgi/php/1118663500/
【Agile】Ruby on rails相談所 part2【DRY】
http://pc10.2ch.net/test/read.cgi/php/1151254378/
【Ruby】Ruby on Rails Part3
http://pc11.2ch.net/test/read.cgi/php/1170760209/

↓ム板に

Ruby on Rails
http://pc11.2ch.net/test/read.cgi/tech/1191381506/



Ruby on Rails のスレ が
http://pc11.2ch.net/test/read.cgi/php/1207425569/

【Ruby】Ruby on Rails Part6
http://pc11.2ch.net/test/read.cgi/php/1224838013/

【Ruby】Ruby on Rails Part7
http://pc11.2ch.net/test/read.cgi/php/1241100447/

【Ruby】Ruby on Rails Part8
http://pc11.2ch.net/test/read.cgi/php/1252842574/
(イマココ)
0003nobodyさん2010/02/19(金) 16:16:16ID:WbFNhWFy
rails メーリングリスト
http://www.fdiary.net/ml/rails/
0004nobodyさん2010/02/19(金) 18:31:41ID:???
ブログのような日時で予約投稿する機能を作りたいと思っています。
こういった定期処理はどのように実装したもんでしょうか?
精度的には分単位が必要です。

こちらで考えたのは、毎分ごとにcronでscript/runnerをキック、もしくは
javan's whenever at master - GitHub
http://github.com/javan/whenever
のようなRubyGemsを使って(といっても上記は実質cronですが)
DBの該当モデルの公開フラグをオンにする、というような実装です。

ただ問題なのは、script/runnerの起動自体が重く数秒(下手すると5秒程度)CPUを占有することもあり、
こういった方法は一般的なものなのか?と思ったしだいです。
0005nobodyさん2010/02/19(金) 18:41:23ID:WbFNhWFy
Rails で cron を使わずに cron っぽいことを行う方法
poormans_cron プラグイン
http://everyleaf.com/blogs/2009/12/20/poormans_cron/

[Rails]Rails - crontabでバッチ処理を行う
crontabからscript/runnerでmodelのメソッド呼んで上げればいい
http://d.hatena.ne.jp/arcright/20090824/1251142139

MOONGIFT: ? RailsのCron処理に「Whenever」:オープンソースを毎日紹介
http://www.moongift.jp/2009/06/whenever/
0006nobodyさん2010/02/19(金) 18:48:37ID:R+yZ5C0Y
アプリ側にdrbでアクセスできる口を用意しておいて、
cronからはそれに触るだけ、とかすれば重さは解消
できるかもな。
0007nobodyさん2010/02/19(金) 19:28:20ID:XnDPmidp
rufus_scheduler
0008nobodyさん2010/02/19(金) 19:29:57ID:WbFNhWFy
Amazon.co.jp: 小さなチーム、大きな仕事―37シグナルズ成功の法則 (ハヤカワ新書juice):
ジェイソン・フリード, デイヴィッド・ハイネマイヤー・ハンソン, 黒沢 健二: 本
http://www.amazon.co.jp/gp/product/4153200115


http://twitter.com/dhh/status/9310086401
http://www.hayakawa-online.co.jp/product/books/220011.html
0009nobodyさん2010/02/19(金) 19:39:14ID:???
>>8
Getting Real の邦訳?
0010nobodyさん2010/02/19(金) 20:15:00ID:WbFNhWFy

Rails 3 Beautiful Code
http://www.slideshare.net/GreggPollack/rails-3-beautiful-code-3219240
0011nobodyさん2010/02/19(金) 23:19:34ID:???
>>4
キューから仕事引っ張り出すデーモン立ててやるのが一般的かな。
キューの実装はいろいろ。
0012nobodyさん2010/02/20(土) 00:16:46ID:???
実行する頻度が多くないのなら、script/runnerも十分実用できるけどね。1日1〜2回だけ実行するものとか。
あとは、cronで起動するバッチではコントローラのアクションをnet/httpで叩くだけにして
実際の処理はコントローラ側でやるという方法もアリだと思う。
0013nobodyさん2010/02/20(土) 15:01:40ID:???
railsサーバーから別のファイルサーバーに画像をアップロードした場合、
ダウンロードは出来るんだが、画像を表示しようとすると
ルーティングエラーで画像が表示できない。
ただのファイルサーバーを追加するって出来る?
publicにファイルサーバーのショートカット作っても駄目だった。
railsは2.1.2、rubyは1.8.7。
0014nobodyさん2010/02/20(土) 15:05:28ID:3Z++wair
http://d.hatena.ne.jp/Molokheiya/20100219/p1
0015nobodyさん2010/02/20(土) 15:08:17ID:???
何を言っているのか分からないんだが。
環境やパスについてもう少し詳しく情報出さないと分かるわけないでしょ。

普通に考えれば、ファイルサーバの画像を置くパスをWebから見れるように
Apacheなどの設定をしておけば、http://ファイルサーバのホスト/画像のパス
で見れるようになるはず。

0016nobodyさん2010/02/20(土) 15:12:43ID:zWoV3Do7
>>13
public以外の場所に置いた画像をブラウザから観られるようにしたい
という意味?
0017nobodyさん2010/02/20(土) 15:36:12ID:???
簡単なコンボボックスの実装を教えてください!
0018132010/02/20(土) 15:54:51ID:???
>>16
そんな感じ。

画像の保存先を"/Volumes/gazou/upload"っていう
gazouサーバーのuploadフォルダにしたとき、
formからfile_fieldでアップロードするとファイルは
"/Volumes/gazou/upload"にアップされるんです。
indexでimage_tag("/Volumes/gazou/upload/test.jpg"
で表示しようとすると、RoutingErrorになります。
サーバーはとりあえずlighttpd使ってます。
0019nobodyさん2010/02/20(土) 15:57:31ID:???
>>18
当たり前だろ、ここはお前レベルの人間が来ていいところじゃない。
ファイルシステムから勉強し直せ。
0020nobodyさん2010/02/20(土) 17:07:46ID:???
ははは
0021nobodyさん2010/02/20(土) 17:16:09ID:???
>>18
そもそも、そのファイルサーバーの画像はブラウザから見られる?

/Volumes/gazou/upload ←これはサーバーのローカルからアクセスできる”ファイルのパス”

image_tag("/Volumes/gazou/upload/test.jpg") ←ここに指定するのは”URL”

<img src="/Volumes/gazou/upload/test.jpg" />
こういうHTMLになるはずだが、
もしだよ、こんなに仮にローカルのパスがwebから全世界から簡単に見られたら、
パスワードファイルとか大事なDBのデータとかすき放題アクセスできてしまう。

だから、webサーバー、例えばapacheなどでURLとして公開するディレクトリと
ローカルからアクセスできるファイルのパスを関連付けて設定しないと、webブラウザで見られない。

・案1 ファイルサーバーの画像置き場以下をwebサーバーで公開する。
 apache等使っているならやり方はググれ。スレ違い
# 簡単だがこの方法の欠点としては、ログインしてない人に画像が見られるのを防ぐといったアクセス管理がちょっとしづらい。

・案2 Railsのコントローラーでファイルサーバーからバイナリで読んで画像としてブラウザに返す
やり方シランw ググれ
 
>>19
まあまあw
0022nobodyさん2010/02/20(土) 17:17:31ID:???
ダウンロードできるなら表示もできるのでは
0023nobodyさん2010/02/20(土) 17:18:43ID:???
・案3 忘れてた

/Volumes/gazou/upload から RAILS_ROOT/public/upload にシンボリックリンクを貼って、
image_tag("/upload/test.jpg")

でアクセスする。
こっちも簡単でいいな。
0024nobodyさん2010/02/20(土) 17:21:13ID:???
Windowsかな?
ダウンロードはできる、っていうのは、
多分ブラウザにファイルサーバーのパスを突っ込んだら、ファイラーとして動いて表示されてるだけ、とか?

ダウンロードはできる、ってのは見逃してた。上の書き込み全然外してるかもしれんw
0025132010/02/20(土) 17:42:56ID:???
>>24
macです。
「ローカルでしか見ない」っての付け足せば良かった。ゴメン。
ローカルでしか見ないから>>19が言いたいアクセス関係は無視してたんだ。
案3も試してみたけど駄目だった。単にファイラーで動いてるだけなんだな。
RoutingErrorって出るからルーティング出来ればいけるかな?
って思っただけなんだ。
0026nobodyさん2010/02/20(土) 18:30:50ID:zWoV3Do7
「ショートカット」の件

UNIXでいうシンボリックリンクはrubyやhttpdみたいな
UNIXコマンドからはそのまま読めるけど、
Macでいうエイリアス(UNIXシェルのエイリアスとは意味が違う)だと、
うまく読めないはず。
0027nobodyさん2010/02/20(土) 18:40:44ID:zWoV3Do7
MacOS X Snow Leopard にて

$ rails myapp
$ cd myapp/public
$ ln -s /Volumes/fuga upload
$ script/server

とした場合、 /Volumes/fuga/hoge/gazou.png には
http://localhost:3000/upload/hoge/gazou.png
でアクセス可能。
0028nobodyさん2010/02/20(土) 18:49:26ID:???
案2ベースだと、send_fileでとりあえずできそう
http://api.rubyonrails.org/classes/ActionController/Streaming.html
0029nobodyさん2010/02/20(土) 20:07:25ID:???
こんなのにいつまで付き合うの。
0030nobodyさん2010/02/21(日) 01:44:57ID:o+L/Pmc4
画像もDBに格納して管理する −扱いがめんどうなLOB(ラージオブジェクト)は使わない方法も含め
http://b.hatena.ne.jp/entry/neta.ywcafe.net/000774.html

- Encode "icon.png" in Base64 as "base64.txt":
--------------------------------------
File.open("base64.txt","w") do |file|
file.write [open("icon.png").read].pack("m")
end
--------------------------------------

- Decode "base64.txt" as a PNG "new_icon.png" file:
--------------------------------------
File.open('new_icon.png', 'wb') do |file|
file << (IO.readlines('base64.txt').to_s.unpack('m')).first
end
--------------------------------------
http://www.ruby-forum.com/topic/200065

RubyでBase64
http://d.hatena.ne.jp/nacookan/20071203/1196701095
0031nobodyさん2010/02/21(日) 02:45:34ID:???
>>30
BLOB型をなんでそんな嫌ってるのかが分からんね。
記事は面白かったけど前提が強引過ぎてなんとも。
0032nobodyさん2010/02/21(日) 10:01:17ID:???
×BLOBが嫌い
○rubyのバイト列の扱いが嫌い
0033nobodyさん2010/02/21(日) 12:44:36ID:???
ここRailsスレだろ?
確かにSQLでLOBを扱うのは面倒かもしれんが、
RailsというかActiveRecordならLOBなんて笑っちゃうくらい簡単に扱えるのだが
0034nobodyさん2010/02/21(日) 14:32:45ID:o+L/Pmc4
http://books.google.com/books?id=-7iMOLUQDqQC&pg=PA110&lpg=PA110&dq=ActiveRecord%E3%81%AA%E3%82%89LOB&source=bl&ots=NFLNj1rWKR&sig=unj3i2VegYEijfPCAc2nODAlrJE&hl=ja&ei=Z8OAS465HcXnkAWWub31BA&sa=X&oi=book_result&ct=result&resnum=5&ved=0CBcQ6AEwBA
0035nobodyさん2010/02/21(日) 14:35:08ID:???
class Blog
class Post
belongs_to :blog

と、関連を指定しているときに post.blog でアクセスできるのはわかったんですが
post.blog.title でソートしたいときに
Post.find(:all) で指定する :order ってどうしたらいいですか?
:joins => "LEFT JOIN blogs" して "ORDER BY blogs.title" みたいな?ことを
SQLっぽいことを書かずにできる方法ありますか。
0036nobodyさん2010/02/21(日) 16:25:55ID:wFIWx53c
テーブルの結合の一部は :include で出来るけど
:order は ORDER句に書くものを書くところなので
結局そこはSQLにならざるをえない。

Rails3のSQLハンドリングの裏方として採用されている
Arel(Active Relations)ではこうも書けるんだろうけど、
SQLの *隠蔽* にはならんだろうね。
posts.join(blogs).on(posts[:blog_id].eq(blogs[:id])).order(blogs[:title])
0037352010/02/21(日) 16:51:21ID:???
>> 36 ありがとうございます。すっきりしました。

POSTされたパラメータ params[:sort_index] が "updated_at"だったら
そのままコントローラで :order => params[:sort_index] とできるんですが
"blog[title]" のときは結合したテーブル名.カラム名に変えないといけないのが
スマートじゃない気がして、他にもっといい方法があるんじゃないかと思ってました。

Rails3 も Arel も無知なので、勉強してみます。
0038352010/02/21(日) 17:08:14ID:???
自己レス

なら、params[:sort_index]の中身が"blog.title"ってなるようにビュー側を
変えればいいのか orz
なんとなくシンボルでアクセスすることが多いので
params[:blog][:title] → params["blog.title"] はちょっと違和感あるけども
0039nobodyさん2010/02/21(日) 17:49:03ID:???
そのパラメータに変なもん指定されて、
SQLがエラーになるよ。
カラム名丸出しもカッコ悪い。
0040352010/02/21(日) 19:27:35ID:???
>>39 確かに、SQLインジェクションはまったく考慮してませんでした。

でも、カラム名丸出しってカッコ悪いんですか?
少なくとも初心者の自分が触れる書籍なんかのコードは大体カラム名丸出しというか、
そもそも FormBuilder がそういう HTML 吐いちゃうから当たり前なんだと思ってました。

0041nobodyさん2010/02/21(日) 19:45:31ID:???
カラム名丸出しはカッコ悪くないよ。
でもそう思っちゃう人もいるってことで。
0042nobodyさん2010/02/21(日) 19:47:26ID:???
>>40
:orderに入る部分はエスケープされるんだっけ。
そしたらSQLインジェクションの心配はないと思うんだけど、
カッコ悪さに関しては、URL中にSQLの一部が出てくるのがなんか気持ち悪いなあと思ったから。
0043nobodyさん2010/02/21(日) 20:00:49ID:wFIWx53c
limitに渡る部分はいつぞや脆弱性として報告されて
( http://secunia.com/advisories/31875/ )、修正が入ってる。

orderについては↓でrejectされている、ようだ。
http://dev.rubyonrails.org/ticket/7684
0044352010/02/21(日) 21:18:26ID:???
>>42 なるほどPOST中のデータにピリオドがついてたら、見る人が見れば
SQLのテーブルを指してるかもって思われやすいってことですね。

他のみなさんのレスも勉強になります。ありがとうございます。

と、関係ない質問ですけど、名前空間付きの scaffold をしたときの話で、
scaffold my_namespace/hoge name:string としたときマイグレーションファイルは
my_namespace_hoge という名前のテーブルを作るようになってますが、
モデルの MyNamespace::Hoge は hoge テーブルを参照しようとしてます。
今のところ名前空間は route とか controller の都合でやってるもの、という解釈で
マイグレーションファイルの方を hoge テーブルを作るように毎回書き換えてます。
(モデルのクラスにも名前空間が適用されているんだから、MyNamespace::Hogeクラス
がmy_namespace_hoge テーブルを使ってもいいんじゃないか?というかこっちのが正しくね?
でもテーブル名が長くなっちゃね?ユニークさが増していいんじゃね?と悩みながら)

これってどうするのが on Rails なんでしょうか? 
というか自分の環境(JRuby1.4 Rails 2.3.5)だけの問題だったりするんでしょうか?

0045nobodyさん2010/02/21(日) 22:13:12ID:???
というか、scaffoldから卒業して自由に作るのが楽だし、楽しいんじゃない?

0046nobodyさん2010/02/21(日) 22:17:43ID:???
名前空間付きモデルやろうとしたことあるけど、
結局DBのほうは名前空間持てないのでややこしくなるだけだと思った。
なるべくconventionに従ってややこしいこと避けるならやらない方がいい。
どうしてもやるのなら migration を書き換えるか set_table_name
0047nobodyさん2010/02/21(日) 22:21:17ID:???
名前空間とテーブル名は必ずしも合ってなくていいと思うけど。
というか合わせられるとかえって困ることも。

例えばusersテーブルを考えると、ユーザーが自分で操作する画面と、
管理者が操作する画面は別に作る可能性とかある。管理者の方が内部データを操作できるとか。
テーブルと画面が必ず1:1なら、言うとおりでもいいかもしれないけど。
0048352010/02/21(日) 22:54:30ID:???
>>45 確かにそれもわかるんですが、設定よりも規約の
規約がわからない段階だと scaffold で助かることもあります。

あくまで規約にのっとったうえでの自由が Rails 的な楽しみ方なのかな
というのもありますし。


と、scaffold の件は規約にはなってない(テーブル名は任意で、どうでもいいよそんなこと)
ってことなんですかね。。
覚えることがいっぱいで書籍の範疇からはずれたとたんにあたふたしてます。

>>46, 47
名前空間はMVCで言うところのVCよりなところで分割してみたいってのが
あってやってみました。なんか一階層の URL が寂しかったってのもあり。。

users テーブルの例も、複数の UI を用意することはあっても、結局触るモデルは1つ
ってことですね。
テーブル名が衝突するようなこともまずなさそうですし現行のままで行ってみます。
0049nobodyさん2010/02/22(月) 00:21:22ID:???
>>48

>覚えることがいっぱいで書籍の範疇からはずれたとたんにあたふたしてます。

scaffoldに頼っている限りは、そうなってしまうよ。
一通り慣れてきたら、scaffoldで自動生成せずにアプリを作るようにしてみると
自分が理解していなかった部分が浮き彫りになるし、
それで分からない事をその都度調べていくと、すごくレベルアップできるよ。

0050352010/02/22(月) 07:01:04ID:???
>>49 > scaffoldに頼っている限りは、そうなってしまうよ。

そのせいですかね??
scaffold を使えば10分でブログができる的な謳い文句はよく見ますが
実際は、それだけで作ったブログなんて誰も使わないわけで、それぐらいの
頼りなさが、ほんとに土台なんだなって、それぐらいはわかります。
最近は、単純にMVC一括でルールに従ったファイル名のファイルを作ってもらう
だけのジェネレータ的な使い方で、あたふたは単に自分の能力の問題、っていう認識です。

モデル名の複数形がテーブル名っていう規約はわかってるんですが、
今回の件のように、モデル側は名前空間を含めないテーブル(hoge)を参照しようとして
マイグレーションファイル、test/unit 以下は名前空間を含めた
テーブル(my_namespace_hoge)を参照しようとするコードを scaffold が吐く
っていうのは、何か知らない規約がある、もしくは環境が変、とかそれなりの
理由があるのかな?と思ったわけです。

名前空間つけたときって、どういうフォルダ構成になるんじゃろって、scaffold で
気軽に知れたのまではよかったんですが、scaffold 直後の rake test:units で、
一発じゃ通らないんで、あれれ?と。
0051nobodyさん2010/02/22(月) 12:43:48ID:???
名前空間付きscaffoldってどっかにプラグインなかったけ?今も動くかわからんけど。

俺の場合、管理者用の http://~~~/admin/ 以下用のコントローラー作るときは
 script/generate scaffold admin::hoge ってやるけど、
モデルは階層化いらんから
 script/destory model admin::hoge
ってすぐ消してる。

もちろんコントローラーをadmin::hogeモデルからhogeモデルへの依存へ書き換えは必要
0052nobodyさん2010/02/22(月) 16:08:14ID:???
cukeやRspecなどのTDDやBDDからプログラム作りはいった方がいいんじゃない?
0053352010/02/22(月) 20:19:06ID:???
こだわるような内容じゃないってのは承知の上ですが何回もレスしてすいやせん。

scaffold に限らず、ジェネレータが吐くコード = 標準的(規約)
な考えがあるので、整合性がないように「見える」と疑問がわきまして。
みなさんのレスから察するに、特に大きな理由などはなさそうなので
たまたま名前空間の機能追加中に現れた現象ってことでスルーしてみます。
Rails3になったら、何事もないようになってるのかなー。

本題に対する回答ではないですが、モデルだけ消す方法から、cuke,Rspecという
知らなかったキーワードまで参考になりました。ありがとうございました。
0054nobodyさん2010/02/22(月) 20:43:45ID:SMf+P9Hc

rubygems-update 1.3.6 Released
http://www.ruby-forum.com/topic/204581
0055nobodyさん2010/02/23(火) 00:05:56ID:qmMkHKt3
RORのままアーキテクチャの変更で10000%高速化したとな。
ttp://b.hatena.ne.jp/entry/highscalability.com/scaling-twitter-making-twitter-10000-percent-faster

ミニブログの Twitterのstats(統計)データ。
http://kaworu.jpn.org/kaworu/2008-01-16-2.php
- 350,000を超えるユーザ。
- 秒間600リクエスト
- 平均毎秒200-300コネクション。最大時は秒間800コネクション
- MySQLは秒間2,400リクエストを処理する
- 180のRailsインスタンスがある。MongrelのWebサーバを使っている。
- 1つのMySQLサーバ(1つの大きな 8コアのサーバ)と1つのスレーブ。スレーブは、統計とレポートのための読み込み専用(リードオンリー)。
- 雑用処理をするための30+のプロセス
- 8台のSun X4100s
- Railsでのリクエストの処理時間は200 msec
- データベースにかかる時間の平均は、50-100 msec
- 16GBの memcached
0056nobodyさん2010/02/23(火) 00:40:21ID:???
前スレでも同じの張ってただろ
いい加減飽きたんだが。
0057nobodyさん2010/02/23(火) 00:43:53ID:qmMkHKt3

Twitter創始者が語るWeb 2.0の要諦 − @IT
http://www.atmarkit.co.jp/news/200711/16/twitter.html
Odeo内で始めた小さなプロジェクトが「Twitter」だ。
Ruby on Railsを使って2週間で最初の動くバージョンを作り上げたという。
0058nobodyさん2010/02/23(火) 01:04:24ID:???
親切でやってるのかもしれないけど、
なんの言葉もなく何度もURLを貼られるとむかついてくるのだが
0059nobodyさん2010/02/23(火) 01:19:43ID:???
何かしらのコメントを付け加えないと、ただのノイズでしかないよな。
0060nobodyさん2010/02/23(火) 01:24:37ID:24B872MQ

The Rails 3 Upgrade Handbook
http://www.railsupgradehandbook.com/
0061nobodyさん2010/02/23(火) 17:54:54ID:qmMkHKt3

>>30
[Rails] DBに入れた画像を表示する
0062nobodyさん2010/02/23(火) 17:56:23ID:qmMkHKt3

>>30
[Rails] DBに入れた画像を表示する
http://d.hatena.ne.jp/hichiriki/20100110/1263125573
0063nobodyさん2010/02/24(水) 06:06:13ID:xyBYpSVv


http://www.hostingrails.com/?url_string=index
http://www.slicehost.com/
http://www.linode.com/

The Best Ruby on Rails Hosting Services
http://antoniocangiano.com/the-best-ruby-on-rails-hosting-services/

■ このスレッドは過去ログ倉庫に格納されています