【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:???ありがとうございます。
その記述だとcountryのパラムに何か値が入っていると
それにキーをつけてキャッシュしていってくれるのかな?
しかし、1ページ目と2ページ目以降の全てが同じ内容で表示されちゃいますよね?
country=47と且つpage=7
とかとの組み合わせで何とかキャッシュできないかな?
0979nobodyさん
2013/01/28(月) 10:02:05.35ID:???キャッシュのキーがログに表示されるから確認してみて。
0980nobodyさん
2013/01/28(月) 10:22:55.99ID:???ありがとうございます!
たとえばパラメータが
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 params[:query].blank? && params[:country].blank?
- cache suffix: params[:page] do
ページ別にキャッシュされる
- else
キャッシュされない
0982nobodyさん
2013/01/28(月) 11:38:30.53ID:???さっそく、ありがとうございます
コントローラー内
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? && 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:???ご丁寧にありがとうございます
すみません。
勘違いしていました。
ビューではなく、
SQLコマンドで取得した結果内容だけをキャッシュに格納しておく。
次回、同じ内容のリクエストがあり、もしそのキャッシュが存在したら、
いちいちSQLコマンドが実行されず結果だけ取り出される。それをそのままビューに渡す。それが故に処理が早くできる。
つまり、コントローラー内である程度は簡潔できるものだと思いこんでいました
必ずビューへの記載も必要になってくるんですね
結構めんどうな作業になりそうですね。
本当にご丁寧にありがとうございました。
家に帰ったら試してまた報告いたします。
0987nobodyさん
2013/01/28(月) 16:00:23.37ID:???ここで作られた paginationやmodeパラメータつきのキャッシュをアクション内で消すには
どのように記述するべきですか?
一般的にはRails.cache.delete(:key)
ですが
教えていただいた方法で出来たキャッシュがどこに出来ているのか分かりません。
postsに更新がかかったり、レコードが新たに作られたときに、キャッシュを全て削除したいのですが、
それら(posts#index)で出来たキャッシュを一気に消すにはアクション内でどのように記述するべきですか?
0988あ
2013/01/29(火) 06:42:48.31ID:???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:9UmlSZdWhttp://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:9UmlSZdWhttp://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:???productionモードに移行した途端に表示されなくなりました
同様に色んなところでproductionモードでの挙動がおかしいです。
developmentモードで真剣にバグ潰ししてたのは何だったの?といったレベルです
もうこの際、developmentモードを本番として公開しようと思うのですが
エラー内容を表示させない方法はありますか?
それとproductionモードと比べたときに、遅いとか、何かデメリットはありますか?
0993nobodyさん
2013/01/30(水) 08:14:42.30ID:???config.serve_static_assets = true にしても駄目?
0994nobodyさん
2013/01/30(水) 10:10:02.52ID:???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:???0996nobodyさん
2013/01/30(水) 11:49:30.40ID:???上の人が書いてるように設定変えるだけでOK
0997nobodyさん
2013/01/30(水) 14:33:00.58ID:???>>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:???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:???10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。