【RoR】Ruby on Rails Part13

このエントリーをはてなブックマークに追加
931nobodyさん:2012/02/12(日) 16:48:46.22 ID:???
>>930
Playはいいね
でも国内とかで実績というか大きな例ってある?
932nobodyさん:2012/02/12(日) 17:37:02.40 ID:???
Playは最初良さげに見えたから使ってみたらダメだったという話は聞く。
まだ早いんでないかしら。
デモ見ると確かに良さげなのだが。
Grailsも使ってる大きなとこ知らんし。
933nobodyさん:2012/02/12(日) 18:57:34.11 ID:???
Railsにインスパイアされたフレームワークはあくまでエッセンスを取り入れてる
に過ぎないんだよな

最近のRailsは基本的な考え方はそのままにかなりのスピードで進化しているし、
他のフレームワークはそのスピードについて来れていない

まぁ、そのスピード感についていけない開発者も文句を言うきらいもあるが
934nobodyさん:2012/02/12(日) 22:37:39.70 ID:6rSX5KYj
本当はrailsの話ではないんだろうけどちょっとクイズと思って答えていただければ…

とあるシステムがA社向けとB社向けに卸されている
2つのシステムはRailsで作られていてほぼ同一のもの、viewだけがカスタマイズで大きく異なっている
ソースコードはgitで管理されている

システムにバグが見つかったので片方に修正を複数箇所の修正をかけた
さてこれで修正点をもう片方に反映する最適な方法は?
一番馬鹿な方法はgit logして修正したファイルの一覧を見つけて
全部上書きなんだろうけど
2社じゃなくて5社10社分で同じ状況の時を考えてみてもらえると嬉しいです
935nobodyさん:2012/02/12(日) 22:59:43.14 ID:1sMAjxn+
git format-patch / am あたりじゃないの?
936nobodyさん:2012/02/12(日) 23:01:37.29 ID:???
A社とB社でブランチきってないわけ?
どういう管理してるんだかわからんがバージョン管理してるのに手動で上書きって・・・・
937nobodyさん:2012/02/13(月) 02:29:34.02 ID:???
git rebaseって超便利じゃね? - Seasons.NET
http://d.hatena.ne.jp/Seasons/20090329/1238351273
938nobodyさん:2012/02/13(月) 13:04:18.98 ID:???
ミニブログの 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
939nobodyさん:2012/02/13(月) 13:10:38.06 ID:???
Scaling Twitter ? SlideShare
http://www.slideshare.net/Blaine/scaling-twitter
940nobodyさん:2012/02/13(月) 13:20:27.55 ID:???
941nobodyさん:2012/02/13(月) 13:25:21.95 ID:???
octopus
Database Sharding for ActiveRecord
https://github.com/tchandy/octopus

User.where(:name => "Thiago").limit(3).using(:slave_one)

Octopus.using(:slave_two) do
User.create(:name => "Mike")
end
942nobodyさん:2012/02/13(月) 15:23:56.28 ID:JBva2IDx
rails初心者ですが質問させてください

ruby1.9.2
rails3.1.3

アップロードされたが画像の表示をリサイズしてからやりたいのですが、
画像をデータベースにbinary型のデータとしてアップロードしているので
public配下のフォルダに保存するpaperclip等は使えません

現状の画像の表示は send_dataで画像のみを表示するshow_photo というアクション作って
色々なページから<%= image_tag photo_show_photo_path(@photo) %> の様な形で埋め込んでいます

ググるとrmagickを使う例が出てきますが、 img = Magick::ImageList.new("test.jpg") の様にファイル名を引数として
指定しているため、どうデータベースのデータを指定すればいいのかが分かりません

またimage_sizeを使う例でも http://blog.matake.jp/archives/rails_image_size.htmlの ファイル名を引数にとっているので、
どの様にデータベースのbinary型のデータを読み込めば良いかわかりません

上の二つを応用したいのですが、どなたかデータベースからデータをとって来て処理する方法を教えていただけないでしょうか?
よろしくお願いします
943nobodyさん:2012/02/13(月) 20:25:35.83 ID:+j7LBGVZ
944nobodyさん:2012/02/13(月) 21:03:10.66 ID:???
>>223

ちょっと遅レスだけど、レスありがとう。
結論から言うと、config/initializers はrails g modelの時によみこまれないのか、
うまくいかなかった。

https://github.com/technoweenie/attachment_fu/issues/41

どうも外人もattachment_fu.rb直接いじってるぽい。
いいんか・・・
945nobodyさん:2012/02/13(月) 22:28:24.43 ID:r3WlVMK6
すみません、どなたか助けてください

ログインユーザが admin のときだけ管理メニューをナビゲーションにだしたくて、
application.html.erb を以下のようにかいています。

<li><a href="http:">Contact</a></li>
<%= show_admin_menu_if_admin %>
</ul>

ここで、show_admin_menu_if_admin は application_helper.rb で以下のように定義してます。

def show_admin_menu_if_admin
if session[:user_id]
if User.find(session[:user_id]).name == "admin"
'<li><a href="/users">Users</a></li>'
end
end

ところが、これを実行すると以下のように < や = が < や &eq に展開されてしまい、
HTMLとして解釈してもらえません

<li><a href="/users">Users</a></li>

erb のなかからクオートされない HTML を生成するにはどうしたらいいでしょうか。
946nobodyさん:2012/02/13(月) 22:34:06.22 ID:+j7LBGVZ
string.html_safe! とか <%= raw ... %> とか。
tagヘルパーも使おうな。


947nobodyさん:2012/02/14(火) 06:05:21.88 ID:???
>>942
githubに保存にDBを使えるPaperclipがある。forkされてるから。
本家だけじゃなくて、forkされてるものも探すと良いよ。
948nobodyさん:2012/02/14(火) 06:09:01.08 ID:???
raw 書きたくなかったら
<%== >
も使える。
949nobodyさん:2012/02/14(火) 06:12:48.73 ID:???
>>945
認証に何使ってるか知らないけど
if current_user.admin?
みたいにしたら良いのに
950nobodyさん:2012/02/14(火) 13:48:09.28 ID:vL4j2NEB
>>943
ありがとうございました
無事表示できました!!
951nobodyさん:2012/02/14(火) 23:16:14.43 ID:???
945です、皆さなどうもありがとうぎざいました。raw で表示できました
952nobodyさん:2012/02/14(火) 23:18:40.87 ID:???
>>949
ご指摘ありがとうございます
user.rb に admin? を追加すればいいでしょうか
953nobodyさん:2012/02/15(水) 13:41:11.96 ID:NemRvMc3
ボタンの2度押し防止をしたいと思っています。
button_toに"disable_with"という引数を与えれば、ボタンを押した後にグレーアウトし、押せなくなります。
しかし、押せなくなるのは押したボタンだけで、画面上の他のボタンは押せるのです。
その画面はデータを更新する画面ではなく、データの表示、そしてボタンにより別画面への遷移を行うだけの画面です。
なのでform_forは使えないのです。

どうにか、どれか一個のボタンを押したら、画面上全てのボタンをDisableにすることはできないでしょうか?
ご存知の方がおられましたら、よろしくお願いいたします。
954nobodyさん:2012/02/15(水) 13:44:35.77 ID:???
>>953
railsじゃなくてjavascript
955nobodyさん:2012/02/15(水) 14:26:44.14 ID:RCBLEB3T
>>953
Railsだけでやりたいなら

form_tag "/" , :remote => true do

ほげほげ

submit_tag "オッケー" , :disable_with => "ロック" , :onClick => "return false;"

これで出来ると思うけど、スマートじゃないしおとなしくJS使うべき
956nobodyさん:2012/02/15(水) 16:24:52.48 ID:???
957nobodyさん:2012/02/15(水) 18:23:07.04 ID:???
【ウェブアプリケーションという不幸 】

現在、多くのプログラマ(素人)がウェブアプリケーションというものがベストな正しい方向だと勘違いしている。
ソフトウェアの作るにおいてそのアプリケーションに応じた状態遷移を実装するというのは基本中の基本である。
その点においてウエブブラウザというある状態遷移が実装されているアプリケーションの上に
また別のアプリケーションを実装するのは論外である。
そこまでするなら普通にアプリケーションを実装してダウンロードして使ってもらえばいいのである。
ウェブアプリケーションとは虚構にしか他ならない。
ウェブアプリケーションを作ろうとしているあなた。
今すぐ普通のアプリケーションとし設計し始めてはいかがだろう。
そうすればきっと後悔しないですむ。

HTMLやHTTPを悪者にはしていない。
TCP/IPができあがり、その応用として、ファイルを送ったりするようになった。
ファイルの中身のテキストにデータ構造をもたせ、それはつまりツリー構造なわけだが
その実装としてのハイパーテキスト、つまりHTMLという送る側と送られる側で決め事(プロトコル)
をつくり、画像や音楽など表現の幅を広げることは当然の成り行きだっただろう。
そして、その送る側としてのHTMLファイルサーバ、つまりWebサーバ、送られる側としてのプロトコルの解釈・表示系としての
ブラウザというアプリケーション。
ここまではいい。
だが、そこから先が素人の発想というか、いそがばまわれを忘れた者の愚かな発想。
つまりブラウザ上で、アプリケーションを動かすという発想なのである。
ブラウザというのは、おくられてきたステートレスな通信内容の一瞬の表示手段でしかない。
つまりアプリケーションのためのひとつのパーツなのである。
Windowsでいえば、コントロールのひとつ。(実際WebBrowserというコントロールがある。)
JavaならWebClietnだ(これは、ブラウザではないが。)。
包含関係が逆なのである。
ブラウザ上にアプリケーションを作るのは愚かなブームである。
958nobodyさん:2012/02/15(水) 18:27:47.97 ID:???
>>957
そうだな、それと同じくしてOS上にアプリケーションを作るのも愚かなブームだ。
959nobodyさん:2012/02/15(水) 18:45:47.81 ID:???
何でもかんでもHTTPの上でってのは気持ち悪いなとは思うわ。
960nobodyさん:2012/02/15(水) 23:46:35.01 ID:???
HTTPがお手軽で実装事例も多いんだからしょうがない
CORBA/IIOPとか考えたくもないだろ?w
961nobodyさん:2012/02/16(木) 03:21:35.33 ID:gUT9ymRS
質問させてください

2ちゃんの様な掲示板を作る時に スレッドのレス一覧の下に書き込みフォームを作るにはどうしたらいいのでしょうか?
scaffoldではnewアクションで空のオブジェクトを作らないといけませんが、
レスするかどうかはわからないのに、レス一覧顔面を見るたびに空のオブジェクトを作るのはもちろんナンセンスですよね?
962nobodyさん:2012/02/16(木) 03:41:59.23 ID:???
963nobodyさん:2012/02/16(木) 07:15:32.07 ID:???
twitterのような大量アクセスサイトでもフレームワークのformクラスは使ってたのかな。
964nobodyさん:2012/02/16(木) 09:05:15.33 ID:???
indexではモデルに関連しないform_tagにしといて、new.htmlに飛ばしてそこでモデルと結びつけるとかは?
思いつきだけど
965nobodyさん:2012/02/16(木) 09:07:41.24 ID:EHmdvyte
indexページからいきなりpostしてもいいのよ。
966nobodyさん:2012/02/16(木) 10:22:54.95 ID:???
別に空のオブジェクト作ってもいいじゃないかと思うけど
967nobodyさん:2012/02/16(木) 11:45:27.27 ID:???
twitter等で一覧を出すコスト >>>>>>>>>>>>> 空オブジェクト作るコスト
968nobodyさん:2012/02/16(木) 11:51:31.84 ID:gUT9ymRS
色んな方々、アドバイスありがとうございます
確かに普通にhtmlでフォームを作ればできる感じはしますね
あと空のオブジェクトを作る方法でもできる気はします(多分)

でも自分の勉強がメインなので、の空のオブジェクトを作らない かつ ビューヘルパーを使ってやりたいなぁ、と思うので
form_tag等を使う方法で挑戦してみようかと思います
969nobodyさん:2012/02/16(木) 12:40:37.09 ID:gUT9ymRS
連投ですみません

結局目的のform_tagを使ってcreateアクションにpostして掲示板のレスを作ることには成功しました
ただ<%= form_tag({:controller => 'posts',:action=> 'create'}) do %> の様に指定したら
routing error(no route)が返って来てしまいました

結果的には強引な感じはしますが、urlヘルパーを使って<%= form_tag(topic_posts_path(@topic),:method => 'post') do %>
の様に指定したらうまく書き込みができました ネストされたルーティングを使っているため上の様になりました

{:controller => 'posts',:action=> 'create'}の様なコントローラとアクションの指定では、なぜうまく行かないのでしょうか?
rake routes するとちゃんと以下のようにはなっています
POST /topics/:topic_id/posts(.:format) {:action=>"create", :controller=>"posts"}
970nobodyさん:2012/02/16(木) 13:29:38.29 ID:???
:topic_id => @topic.id を入れてないから。
どこで覚えたか知らないが、もうその書き方古い。Rails 1系の時はそれしか無かったけど。

form_for @post do |f|

でいける。@postをきちんと作ってれば。
971nobodyさん:2012/02/16(木) 13:47:21.30 ID:???
>>969
ID付きって事は更新用、scaffoldでいうところのupdateでしょ
create相当のことやるんならIDなしroute

というかscaffoldから始めたら?
972nobodyさん:2012/02/16(木) 14:47:58.94 ID:???
scaffold 作って、index と new を合体させればおk
で済む話では?
973nobodyさん:2012/02/16(木) 17:10:38.51 ID:xHJ9ppvJ
質問お願いします。
今回Railsで初めてアプリを作っていて、ほぼ完成したので
初めてproduction環境でサーバを起動して動かしてみたのですが、
ログに以下のように表示されます。

cache: [GET /] miss
cache: [GET /assets/application.css] miss, store
cache: [GET /assets/img1.png] stale, invalid, store
cache: [GET /assets/img2.png] stale, valid, store
...

これは、どこかに何か問題があるのでしょうか?
そしてmiss, stale, invalid, store はそれぞれ何を意味をしているのでしょうか?
辞書などでstaleを調べると「新鮮でない」とかですけど、ファイルによって
stale, invalid
stale, valid
だったりして、何が良くて何がダメなのかいまいちわかりません。

Rails3.2.1でアセットをプリコンパイルして
production.rbの設定は以下のようにしています。
config.serve_static_assets = true
config.assets.compress = true
config.assets.compile = true
config.assets.digest = false
974nobodyさん:2012/02/16(木) 18:14:17.54 ID:???
production.rb の設定変えてるんだから、自分のやってる事は分かると思うけど。
975nobodyさん:2012/02/16(木) 21:22:21.58 ID:???
>>974
デフォルトではエラーがでたので検索で調べたら設定があることを知って
今のところ、弄ってなんとか動く設定にしただけという感じです。
production環境での正常なログとは、本来どんな感じなのでしょうか?
976nobodyさん:2012/02/16(木) 21:56:18.65 ID:???
どなたかお助けください

2つのモデル(テーブル)
wokerとphoneがあります(両方scaffoldで作成)

workerモデルには has_one: phone
phoneモデルには belongs_to: woker
accepts_nested_attributes_for : woker

のようにしアソシエーションおよびネストを組んであります。
もちろんphoneモデルにはwoker_idのカラムがあり、telという電話番号(tel)のstringカラムもあります。

そこでview/woker/edit.html.erb
にアソシエートしたphone.tel を表示して、そこからテーブルをまたいでphoneの関連レコードも一緒に更新しようとしています。
その際に下記のようにfields_forを使うと、アソシエート先のカラムの表示(中身のデータも)はきちんとされます。
しかし、更新ボタンを押してもアソシエート先のphone.telへ変更が反映されません。一体なぜでしょうか?

<%= form_for @worker, :url => { :action => "create" } do |worker_form| %>
<%= worker_form.text_field :name %>
<%= fields_for @worker.phone do |phone_form| %>
<%= phone_form.text_field :tel %>
<% end %>
<% end %>
977nobodyさん:2012/02/16(木) 22:21:31.19 ID:DriUyt2H
978nobodyさん:2012/02/16(木) 22:52:33.55 ID:???
>>976
まず設計がそもそも悪い。
なんでworker has_one phoneなの?
一つ以上持ってたら?
普通は workerのカラムに phoneをいくつか持たせると思う。

それは置いといて、問題の件は
nested_attributes_for と fields_for の使い方間違ってる(nested_attributes_for 付けるモデルと、fields_for の引数)。
ちゃんと調べ直した方が良い。
979nobodyさん:2012/02/16(木) 22:59:50.92 ID:???
>>978
返信ありがとうございます。
Railsの書籍を3つほど持っているのですが残念ながら、
フォームで関連モデル先のカラム内容までを更新する方法が記載されていません。

試行錯誤しながらネットで調べていたところ、ネストを使えば良いみたいなことが書いてあったので、
お試し的にwork has one phoneという形でテストしているところです。

書籍に載っていなかったことを実現したいので
何をキーワードに調べたら良いものか分からずにいます。

知識不足ですみません。
980nobodyさん
>>976のfields_forを修正しました

<%= form_for @worker, :url => { :action => "create" } do |worker_form| %>
<%= worker_form.text_field :name %>
<%= fields_for @worker_form.phone do |phone_form| %>
<%= phone_form.text_field :tel %>
<% end %>
<% end %>