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

【RoR】Ruby on Rails Part15

レス数が1000を超えています。これ以上書き込みはできません。
0001nobodyさん2012/07/07(土) 00:50:39.45ID:???

http://kohada.2ch.net/test/read.cgi/php/1329492840/

■参考サイト
<英語>
本家:http://rubyonrails.org
API document:http://api.rubyonrails.com/
開発者のblog:http://weblog.rubyonrails.org/
参考wiki:http://wiki.rubyonrails.org/rails
http://ruby-toolbox.com/
http://rubygems.org/
http://agilewebdevelopment.com/plugins/top_rated

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

【ヘロク】 Heroku Part1 【PostgreSQL】
http://toro.2ch.net/test/read.cgi/hosting/1329378677/
0978nobodyさん2013/01/28(月) 08:54:51.35ID:???
>>977
ありがとうございます。
その記述だとcountryのパラムに何か値が入っていると
それにキーをつけてキャッシュしていってくれるのかな?

しかし、1ページ目と2ページ目以降の全てが同じ内容で表示されちゃいますよね?

country=47と且つpage=7
とかとの組み合わせで何とかキャッシュできないかな?
0979nobodyさん2013/01/28(月) 10:02:05.35ID:???
上の例で組み合わせになってるはず。
キャッシュのキーがログに表示されるから確認してみて。
0980nobodyさん2013/01/28(月) 10:22:55.99ID:???
>>979
ありがとうございます!

たとえばパラメータが

params[:page] => ページネーション用のため必要に応じて発生

params[:mode]
params[:country]
params[:query]

と複数あるのですが、
(params[:query].nil? || params[:query] = "") && params[:country].nil?

の時のみキャッシュしていくっていう条件付きで設定出来ますか?
そうしないと 検索される度(query!="")にキャッシュされてしまい
キャッシュが無限大に増殖してしまいますよね。
0981nobodyさん2013/01/28(月) 10:49:58.62ID:???
キャッシュの部分を if で囲めば良いのでは
- if params[:query].blank? && params[:country].blank?
 - cache suffix: params[:page] do
  ページ別にキャッシュされる
- else
 キャッシュされない
0982nobodyさん2013/01/28(月) 11:38:30.53ID:???
>>981
さっそく、ありがとうございます


コントローラー内

if params[:query].blank? && params[:country].blank?
 cache suffix: params[:page] do
  キャッシュする
else
 キャッシュしない
end


↓はどこへ?上の構文より上に記述しとけばokですか?

cache suffix: params.select{ |key| %w(post index page mode).include?(key) }


色々と検索しましたが
やり方が皆さん違うようですね

Rails.cache.fetch(:controller => 'posts', :action => 'index', action_suffix => @key)

が、@keyに結果が既に格納されていたら取り出す。なければ、作って格納する。

だと思っていたのですが
これと絡めるのでしょうか?
0983nobodyさん2013/01/28(月) 12:40:36.07ID:???
フラグメントキャッシュはビューに書く。
<% if params[:query].blank? && params[:country].blank? %>
 <% cache suffix: params[:page] do %>
  <% @posts.each do |post| %>
   <%= post.created_at %>
  <% end %>
 <% end %>
<% else %>
 <% @posts.each do |post| %>
  <%= post.created_at%>
 <% end %>
<% end %>

コントローラーではキャッシュされているか確認して
キャッシュされていないときのみSQLを発行とかする。
if params[:query].blank? && params[:country].blank?
 unless fragment_exist?(suffix: params[:page])
  @posts = Post.page(params[:page])
 else
  # キャッシュされてるから @posts いらない
 end
else
 @posts = Post.where(:query => params[:query])...
end
0984nobodyさん2013/01/28(月) 12:41:35.63ID:???
フラグメントキャッシュはビューに書く。
<% if params[:query].blank? && params[:country].blank? %>
 <% cache suffix: params[:page] do %>
  <% @posts.each do |post| %>
   <%= post.created_at %>
  <% end %>
 <% end %>
<% else %>
 <% @posts.each do |post| %>
  <%= post.created_at%>
 <% end %>
<% end %>

コントローラーではキャッシュされているか確認して
キャッシュされていないときのみSQLを発行とかする。
if params[:query].blank? && params[:country].blank?
 unless fragment_exist?(suffix: params[:page])
  @posts = Post.page(params[:page])
 else
  # キャッシュされてるから @posts いらない
 end
else
 @posts = Post.where(:query => params[:query])...
end
0985nobodyさん2013/01/28(月) 12:44:48.11ID:???
二度書きしてしまった・・・

cache suffix: params.select{ |key| %w(post index page mode).include?(key) }
はキャッシュのキーにキーがpost index page modeのparamsを用いるって意味で
params[:query].blank? &amp;&amp; params[:country].blank? のときのみキャッシュするなら不要だろうと思って
cache suffix: params[:page] に書き換えた。必要なら書き換えて。


フラグメントキャッシュじゃなくてアクションキャッシュの方が良いと思う。
その場合はコントローラーに下の行を書くだけ。
caches_action :cache_suru_action, :cache_path => proc{ params[:page] }, :if => proc{ %w(query country).all?{ |key| params[key].blank? } }

なんか間違ってたらごめんやで
0986nobodyさん2013/01/28(月) 13:19:19.38ID:???
>>985
ご丁寧にありがとうございます

すみません。
勘違いしていました。

ビューではなく、
SQLコマンドで取得した結果内容だけをキャッシュに格納しておく。
次回、同じ内容のリクエストがあり、もしそのキャッシュが存在したら、
いちいちSQLコマンドが実行されず結果だけ取り出される。それをそのままビューに渡す。それが故に処理が早くできる。

つまり、コントローラー内である程度は簡潔できるものだと思いこんでいました

必ずビューへの記載も必要になってくるんですね

結構めんどうな作業になりそうですね。

本当にご丁寧にありがとうございました。
家に帰ったら試してまた報告いたします。
0987nobodyさん2013/01/28(月) 16:00:23.37ID:???
>>985
ここで作られた paginationやmodeパラメータつきのキャッシュをアクション内で消すには
どのように記述するべきですか?

一般的にはRails.cache.delete(:key)
ですが

教えていただいた方法で出来たキャッシュがどこに出来ているのか分かりません。

postsに更新がかかったり、レコードが新たに作られたときに、キャッシュを全て削除したいのですが、
それら(posts#index)で出来たキャッシュを一気に消すにはアクション内でどのように記述するべきですか?
09882013/01/29(火) 06:42:48.31ID:???
Amazonクラウド、244GBメモリとCPUの温度限界まで性能を引き出す超高性能なインスタンス開始
http://aws.typepad.com/aws_japan/2013/01/ec2-for-in-memory-computing-the-high-memory-cluster-eight-extra-large-instance.html

Amazonクラウド、2テラバイトのSSD、60GBメモリ搭載で12万IOPSを実現するインスタンスを発表
http://aws.typepad.com/aws_japan/2012/07/aws発表-new-high-io-ec2-instance-type-hi14xlarge-2-tb-of-ssd-backed-storage.html
0989nobodyさん2013/01/29(火) 15:50:25.21ID:9UmlSZdW
Riding Rails: [SEC][ANN] Rails 3.0.20, and 2.3.16 have been released!
http://weblog.rubyonrails.org/2013/1/28/Rails-3-0-20-and-2-3-16-have-been-released/

Ruby on Railsに新たな脆弱性、アップデートやパッチの適用を - ITmedia エンタープライズ
http://www.itmedia.co.jp/enterprise/articles/1301/29/news099.html
0990nobodyさん2013/01/29(火) 16:46:05.98ID:???
キャッシュがどこに作成されるかは
config/application.rb の config.cache_store による。

フラグメントキャッシュは expire_fragment で削除できる。
http://api.rubyonrails.org/classes/ActionController/Caching/Fragments.html
正規表現を受け付けるようだからキーにマッチするのをを渡せばいい。
キーは自分で指定するので分かってるはずだけどログにも出力されるはず。
0991nobodyさん2013/01/29(火) 17:12:00.58ID:9UmlSZdW
Security announcement: Devise v2.2.3, v2.1.3, v2.0.5 and v1.5.3 released | Plataformatec Blog
http://blog.plataformatec.com.br/2013/01/security-announcement-devise-v2-2-3-v2-1-3-v2-0-5-and-v1-5-3-released/
0992nobodyさん2013/01/30(水) 08:01:12.07ID:???
developmentモードで動いていたcaptchaの画像の表示が
productionモードに移行した途端に表示されなくなりました

同様に色んなところでproductionモードでの挙動がおかしいです。

developmentモードで真剣にバグ潰ししてたのは何だったの?といったレベルです


もうこの際、developmentモードを本番として公開しようと思うのですが
エラー内容を表示させない方法はありますか?
それとproductionモードと比べたときに、遅いとか、何かデメリットはありますか?
0993nobodyさん2013/01/30(水) 08:14:42.30ID:???
config/environments/production.rb の
config.serve_static_assets = true にしても駄目?
0994nobodyさん2013/01/30(水) 10:10:02.52ID:???
ApplicationControllerに、

rescue_from Exception :with => :render_404
def render_404
render :file => "#{Rails.root}/public/404.html", :status => 404, :layout => false, :content_type => 'text/html
end

とでも書けば良いと思われ

ただ速度低下が半端ないので、productionで動くように頑張ったほうがいいと思う 作りにもよるけど、100倍くらい違うと思う
3.2以降は、devでも変更があった場合しかファイル読み込みしない&ルーティング解釈しないようになったらしいから
速度低下は以前ほどでは無くなっているのかな??

productionになると動かんくなるのが多いのは 993さんも指摘してるけど asset pipeline周りが原因のことが多いと思う
0995nobodyさん2013/01/30(水) 10:55:41.63ID:???
$ RAILS_ENV=production bundle exec rake assets:precompile
0996nobodyさん2013/01/30(水) 11:49:30.40ID:???
どうせサーバがwebrickとかのまま、環境だけproductionにしただけでしょ。
上の人が書いてるように設定変えるだけでOK
0997nobodyさん2013/01/30(水) 14:33:00.58ID:???
>>993 ありがとうございます。そのように設定しています

>>994>>995>>996 わざわざ、ありがとうございます。本番への移行でやったことといえば

1. $ bundle exec rake db:create RAILS_ENV=production
2. $ bundle exec rake db:migrate RAILS_ENV=production
3. $ bundle exec rake assets:precompile RAILS_ENV=production

これでアクセスするとsomething went wrongといったエラーが出てきてきました。

心当たりとしては、assets/javascripts以下と assets/css以下に 自分でカスタマイズしたjsファイルやjs.coffeeファイル、css.erbファイルをモデル関係なく単体で作っていたり、
外部のプラグインをそのままフォルダーへ入れていたので

4. config/environments/production.rbに下記の行を追加(これで追加した分も含め該当拡張子の全ファイルをプリコンパイル)
config.assets.precompile += %w( *.png *.jpg *.ico *.gif *.css *.erb *.scss *.js *.coffee)

5. $ bundle exec rake assets:precompile RAILS_ENV=production
6. $ bundle exec rake sunspot:solr:start RAILS_ENV=production

これでアプリは動くようにはなったのですが、なぜかdevelopmentでは生成されていたはずの
simple-captchaというgemのcaptcha画像が表示されなくなりました。
0998nobodyさん2013/01/30(水) 15:03:59.19ID:???
もしかして、画像生成に必要になる Image Magickって devlopmentでは動作するけどproductionでは動かないとかありますか?
0999nobodyさん2013/01/30(水) 15:09:26.24ID:???
自己解決しました

production.rbの
config.action_dispatch.x_sendfile_header = "X-Sendfile"

が邪魔をしていたようです。 コメントアウトすると直りました
スレ汚しすみませんでした
1000nobodyさん2013/01/30(水) 15:21:00.69ID:???
1000
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。