トップページ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/
0951nobodyさん2013/01/18(金) 00:06:21.37ID:???
>>949
んで具体的にどこがどうだと危ないのよ
09522013/01/18(金) 01:05:47.05ID:g1rcdtnm
3-2-xml_parsing.patch
https://groups.google.com/forum/#!topic/rubyonrails-security/61bkgvnSGTQ/discussion
0953nobodyさん2013/01/18(金) 01:07:52.53ID:g1rcdtnm
Solution
http://www.kb.cert.org/vuls/id/380039
0954nobodyさん2013/01/19(土) 13:19:47.80ID:???
viewの中でbegin rescue出来ますか?
0955nobodyさん2013/01/19(土) 22:18:28.14ID:???
>>954
そもそもなぜやりたいんだ?
0956nobodyさん2013/01/20(日) 00:35:37.57ID:???
post可能なのは全部ngなわけ?
つーことはログイン画面も基本あぶないってこと?
やべーな。
09572013/01/20(日) 01:13:53.13ID:???
んで
やべー
やばい
0958nobodyさん2013/01/20(日) 11:34:41.21ID:???
ありがとよ
0959nobodyさん2013/01/20(日) 13:47:03.11ID:???
>>950
ありがとうございました
できましたー
0960nobodyさん2013/01/20(日) 18:52:19.35ID:???
rails3.2をruby1.9で作ったプロジェクトがあるんだけどruby2.0にしても動きます?
0961nobodyさん2013/01/20(日) 20:15:27.82ID:???
tdd
0962nobodyさん2013/01/20(日) 22:47:23.62ID:P+bO0zp9
Bulgarian Politician | Failed Assassination Attempt
http://b.hatena.ne.jp/entry/www.youtube.com/watch?v=h4BUac_yVhU
0963nobodyさん2013/01/22(火) 08:36:44.58ID:???
"Entry"というモデル名をさける
http://www.ustream.tv/recorded/25419544

Enumerable#entries
http://ruby-doc.org/core-1.9.3/Enumerable.html
0964nobodyさん2013/01/23(水) 00:12:21.27ID:???
システム設計のことで質問させてください。

たとえばブログサイトを作ったとします

・ユーザー(User)
・記事(Post)
 ・コメント(Comment)
の3つのモデルがあったとします。

ユーザーの退会時、
:dependant => destroy でユーザーが作成してきた関連レコードも一緒に一斉削除するのが通常かと思います。

しかし、私のサイトではユーザーが他のユーザーの記事を
お気に入りに登録していたりするため、むやみに消せない事情があります。

退会する会員のUserレコードだけを削除した場合、
退会ユーザーのリンク(user_id)が以前投稿したレコードはそのまま残ります。

それらのPostやCommentのレコードは存在し続けても、
作成者が削除されていてuser_idの類にリンクできなくなっているため
nilエラーがどこそこで頻発します。

そこでPostやCommentの作成者名をifか何かで条件から待避させ「退会ユーザー」と統一して表示させ
nilエラーを避けようかと思っています。

みなさんは、こういった処理や
テーブル間の依存関係はどのように設計していますか?
今回の私のようなケースだとどのように削除ルールを作りますか?

会員退会、そのブログの管理は以降は
私が見ますといったかんじです。
09652013/01/23(水) 02:11:24.92ID:???
railsで論理削除をやるなら、acts_as_paranoid plugin
http://b.hatena.ne.jp/entry/d.hatena.ne.jp/fujisan3776/20080912/1221234453
0966nobodyさん2013/01/23(水) 05:11:23.07ID:???
>>965
もうやっています
0967nobodyさん2013/01/23(水) 08:45:57.77ID:yb79r+q4
退会した各ユーザーに「退会済み」という属性を持たせるのが普通?
あとは、退会したユーザーの記事を「退会したユーザー」という特殊な
ユーザー(ログインなどは出来ない)の所有に変更するとか。
0968nobodyさん2013/01/23(水) 15:05:26.11ID:???
実装云々の前に、サイトのポリシーにもよる。
退会してもデータが残って表示される事に、ユーザは同意してるのかどうか。

実装は、#try で
0969nobodyさん2013/01/25(金) 11:18:56.15ID:???
フォームから配列を渡す方法ってありませんか?
a.each do |i|
hidden_field_tag ("key1[]",a[0])
hidden_field_tag ("key2[]",a[1])
end
という方法はあるみたいですがスマートじゃないですよね、、、
しかも
a = [["b","1"],["c",2]]
みたいな2次元配列になると更に複雑ですし。
0970nobodyさん2013/01/25(金) 11:55:55.72ID:???
>>969
つヒント []
0971nobodyさん2013/01/25(金) 12:21:03.24ID:Ecor/dDT
【セキュリティ ニュース】悪用コード出回る「Ruby on Rails」の脆弱性に注意を - NTTデータ先端技術が検証:Security NEXT
http://www.security-next.com/036753
0972nobodyさん2013/01/25(金) 17:50:56.51ID:???
どなたかお助けください!

http://yorunocafe.blogspot.jp/2011/09/i18ngenerators.html
の記事と同じ症状が起きています。
(rails-i18nを使用しようとするとja.ymlの取得がうまくいかない)

記事にあったように、 ja.yml を公式から落としてきて
該当railsプロジェクトのconfig/locales/ja.yml に設置してから
rails g i18n_locale ja を叩いても

fetching ja.yml from rails-i18n repository...
could not find ja.yml on rails-i18n repository

となってしまいます。どなたか解決方法を分かる方はいらっしゃいますか?
0973nobodyさん2013/01/25(金) 20:00:53.13ID:???
>>972です
解決いたしました

しかしながら、rails g i18n jaで生成された
translated_jaに各種テーブルのカラムを入れても反映されません。
なぜでしょうか?
0974nobodyさん2013/01/27(日) 01:39:33.37ID:???
application.rb の i18n.default_locale は設定したの?
0975nobodyさん2013/01/27(日) 22:46:51.72ID:???
Postモデルにおいてフラグメントキャッシュを使用したいと思っています。

しかし、ページネーションを使っている状況でキャッシュを使用すると
2ページ目以降も全て同じ内容でキャッシュされてしまいます。
(コントローラーの1アクションにつき1つのキャッシュをしている?)

こういった場合はどのように対処すればいいでしょうか?

ちなみにページネーションの
page=6 とかだけではなく
query=apple や
country=57 などの複数のパラメータも使用しています。
URLで hoge.com/posts?page=7&query=apple&ciuntry=57

のようになります。
0976nobodyさん2013/01/28(月) 01:41:22.94ID:???
さくらVPSでSSDの鯖が出てるようだけど
1ページあたりの表示のためにSQLリクエストが多い場合だと

SSD 2GBメモリ>>>>>>>>>>HDD 4GBメモリ?
0977nobodyさん2013/01/28(月) 04:17:26.26ID:???
キーをsuffixで指定するらしい。

cache suffix: params

でもこれだと posts?neko=nya とかが渡されると新たにキャッシュが作成されてしまうから
cache suffix: params.select{ |key| %w(controller action page query country).include?(key) }
とかする必要があるみたいだ。
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を超えています。これ以上書き込みはできません。