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

【Ruby】Ruby on Rails Part7

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2009/04/30(木) 23:07:27ID:???
■前 Ruby on Rails のスレ が
http://pc11.2ch.net/test/read.cgi/php/1224838013/

■参考サイト
<英語>
本家: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/

■参考スレ(プログラム板)
Rubyについて Part 35
http://pc12.2ch.net/test/read.cgi/tech/1238194350/
Ruby 初心者スレッド Part 27
http://pc12.2ch.net/test/read.cgi/tech/1238632943/l50
0755nobodyさん2009/07/31(金) 16:31:29ID:???
現在 routes.rb に以下のような定義をしています

map.resources :payments
map.connect ':controller/:action'
map.connect ':controller/:action/:id'
map.connect ':controller/:action/:id.:format'

この場合、例えば http://localhost:3001/payments/list を GET でアクセスできないのでしょうか?

Couldn't find Payment with ID=list

というエラーがでます。

http://localhost:3001/payments/list/0

とやればアクセスできるようです。
0756nobodyさん2009/07/31(金) 17:43:03ID:???
>>755
rake routes
0757nobodyさん2009/07/31(金) 17:43:49ID:???
map.resources :payments
で定義されるルーティングが先にマッチするからでしょう。

rake routes でルーティングを確認しましたか?
07587552009/07/31(金) 18:15:37ID:???
>>756,757

ありがとうございます。
rake routes の結果より

payment GET /payments/:id(.:format) {:controller=>"payments", :action=>"show"}

が優先的にきいてるようです。

:action => "list" が存在しない場合だけ上記が適用されるようにしたいのですが、可能でしょうか?
0759nobodyさん2009/07/31(金) 18:28:39ID:???
 :action => "list" が存在しない場合だけ
の意味がよくわかりませんが、

map.resources :payments
より前に
map.connect '/payments/list' { :controller => "payments", :action => 'list' }
を書くというのが、やりたいことじゃないかと思います。
controller が payments だけじゃなくて、しかも list メソッドが定義されていない場合は
マッチしないでくれ、という場合は…
:id のフォーマットを正規表現で限定する機能が使えるかもしれません。
07607542009/07/31(金) 18:39:13ID:???
いろいろやってたら、Authlogicとacl9で上手く行きました!

> ↓こちらではSubject modelでacts_as_authorization_subjectを書くとかなっててどっちなの?という。

メインの関連するモデル(Authlogicの場合User)は acts_as_authorization_subject の方でいいみたいです。


> それと、結合テーブル作らないといけないみたいなのんですが、
> migrationするroles_usersはモデルも作る必要あるんでしょうか?

必要なかったです。

lib/ruby/gems/1.8/gems/be9-acl9-0.10.0/lib/acl9/model_extensions.rb などを見ればわかるのですが、
acts_as_authorization_subject で、
 has_and_belongs_to_many :roles, :class_name => role
を呼んでおり、(Authlogicの場合)UserとRoleを多対多で関連付けているみたいです。

しかし、この多対多のhas_and_belongs_to_many ですが、下記サイトを見ると
Ruby on Rails - ActiveRecord - ? ありえるえりあ
http://dev.ariel-networks.com/articles/workshop/rails-activerecord

> * has_and_belongs_to_many (HABTM)
> :through 登場以降の存在がいまいち不明なので無視します。

とかあるのですが、これって今は使わないんでしょうかね。


とにかく、おさわがせしました。
ありがとうございました。
0761nobodyさん2009/07/31(金) 19:15:26ID:???
使えないわけではないが、いろいろ扱いが面倒。
has_many :throughだと、テーブルの関連自体をオブジェクトとして
扱えるので何かと便利。
0762nobodyさん2009/07/31(金) 20:33:56ID:TkoSwHP8
>755の貼ってるURLクリックしたら画面が表示されてびっくりした。
paymentsって結構一般的なんかな。
07637552009/07/31(金) 22:15:57ID:???
> 759
やはりそうするしかないですね
ありがとうございます
0764nobodyさん2009/08/03(月) 08:55:54ID:OSViAr5u
質問です。
クッキーストアなセッションを盗聴もしくはXSSによって盗まれた場合、
そのセッションを無効にするには secret を再生成するしかないという理解なのですが、
あってますでしょうか?
0765nobodyさん2009/08/03(月) 10:49:14ID:???
無効にしても、再びxssで正規セッションから誘導出来るので根本対策に成らないと思うが。盗聴も同じ。また盗聴されれば(ry

番号札取られて順番待ちに横入りされまくってる状況をなんとかしないと。
0766nobodyさん2009/08/03(月) 11:03:10ID:???
>>764
そのセッションをと書いてあるだろ。xss気づいた時点で直すだろう。ただ直しても過去のセッションは生きてるから、過去のセッションを無効にしたいってことだろ。そもそも偉そうに言う前に答えてからにしろ。

で、答えは、私も解らん。
もちろんsecret変えれば、無効になるが、それ以外にないかって言われると…。
07677642009/08/03(月) 11:50:48ID:???
>>765, 766
レスありがとうございます。

secret を再生成するとログイン中のユーザーを強制ログアウトしてしまうので、
それ以外の方法はないのかなーと思いまして。

そもそもクッキーが盗まれないようにしろよって話なんですが
07687642009/08/03(月) 12:03:13ID:???
クッキーが盗まれないようにするには、

XSS に対して => アプリ側で穴をふさぐ
盗聴に対して => 通信内容の暗号化 => 全面的にHTTPS

ということになると思うんですが、世の中見渡しても全面的にHTTPS な
Webサービスって少ないですよね。これって

そこまでせんでもええやろ

ってことなんでしょうか?

なんだか XSS に対してはやたらうるさく言われる割に、
盗聴されるとクッキー盗まれるからHTTPSにしなさいってのは(XSSと同じ被害が出る割に)
随分とトーンが弱い気がします。
0769nobodyさん2009/08/03(月) 12:40:19ID:???
Https だと web サーバに負荷が掛かるからでしょ
アクセス数が超多い人気サイトだと、SSLアクセラレータを前に置いたりするが、
それでも処理が捌けなかったり、そもそもそんな金があるなら別のところに使いたい。

携帯サイトだと、毎回 Https のダイアログがあるのは嫌われる。
07707642009/08/03(月) 13:01:19ID:???
>>769
> Https だと web サーバに負荷が掛かる
> 携帯サイトだと、毎回 Https のダイアログがあるのは嫌われる。

お金や個人情報を扱うクリティカルな処理でない限り
コスト・利便性が優先ってことでしょうか。

その辺のバランス感覚がよくわからんす。
盗聴のリスクを過大評価してるんですかね?>自分
07717692009/08/03(月) 13:07:16ID:???
>>770
> お金や個人情報を扱うクリティカルな処理でない限り
> コスト・利便性が優先ってことでしょうか。

まさにバランスだが、そこら辺は難しい。

どこかのセミナーで聞いたけど、セッションハイジャックがおきても、
本当に致命的な情報は盗まれないように設計すべき、というのを聞いた。

たとえばヤフー(さらにたとえればヤフオク)は、入札する直前に、もう一度パスワードを入力させる。
パスワード変更画面へアクセスするときにもパスワードを入力させる。

つまり、攻撃者がクッキーを盗んでセッションに入り込んだら、何でも出来てしまうようではダメ
(ユーザの情報を、何でもセッションに入れてしまうようではだめ)ということ。

ちゃんと考えられたサイトでは、ログインとか決済画面は Https で包んでいても、そうでない画面は
Http だったりする。
07727642009/08/03(月) 13:43:20ID:???
>>771
> ちゃんと考えられたサイトでは、ログインとか決済画面は Https で包んでいても、
> そうでない画面は Http だったりする。

自分が利用しているサービスは大抵そうなってますね。
そのことは実は前から気になってて、いくらログインが https でもこれじゃ
セッション乗っ取られるやんと思ってたのですが、これって仮にセッションが
乗っ取られても(被害0という訳ではないけれども致命的という訳でもない)
なんとかフェールセーフだからこうしますってことなんですね。

なんつーか、そういうもんなんですね、世の Webサービスというのは。
勉強になりましたっす。
07737642009/08/03(月) 14:37:17ID:???
>>764
> クッキーストアなセッションを盗聴もしくはXSSによって盗まれた場合、
> そのセッションを無効にするには secret を再生成するしかないという理解なのですが、
> あってますでしょうか?

自己レス
ログインの度に更新されるトークンをユーザーのモデル属性に追加して、
それをセッションハッシュに含めるようにすれば、例えセッションクッキーを盗まれても
正規ユーザーのログインと同時に無効にできますね。
0774nobodyさん2009/08/04(火) 00:02:32ID:???
クッキー総当たりもあるしなあ。盗まなくても全部試せばってのもある。

正規ユーザのログインを阻害しておけば、いつまでも取得したクッキーで成り済ませるというのもどうかと。
07757642009/08/04(火) 00:18:20ID:???
>>774
> 正規ユーザのログインを阻害しておけば、いつまでも取得したクッキーで成り済ませる

パスワードとメールアドレスの変更さえ阻止できれば正規ユーザーのログインが
阻害されるということはないという認識なんですけど、この場合のログインの阻害とは
物理的にログインできない状態にさせるということですか?

つまり、クッキーを盗んだ犯人が正規ユーザーの知り合いかなんかで、言葉巧みに
しばらくそのサービスにログインしないように仕向けるとか
0776nobodyさん2009/08/04(火) 01:10:30ID:???
>>774がめちゃくちゃすぎてワロタw
0777nobodyさん2009/08/04(火) 16:17:56ID:???
ActionController::HttpAuthentication::Digest でDigest認証をする場合、
functional test はどうやればいいの?
0778nobodyさん2009/08/04(火) 17:45:14ID:???
プラグインが動いたとき、いつも「おーすげー」といってしまう
07797552009/08/05(水) 00:30:31ID:???
select("foo", "bar", {1 => 1, 2 => 2, ....., 20 => 20})
と、数字を20まで表示させたいのですが、ループなどを組んで指定するにはどうやったらいいのでしょうか?
0780nobodyさん2009/08/05(水) 00:50:11ID:???
>>779
opts = {}
(1..20).each {|i| opts[i] = i }

みたいな感じでハッシュを作ってそれを select に渡したら?
0781nobodyさん2009/08/05(水) 01:20:19ID:???
>>780

Hash[(1..20).map{|e|[e,e]}]
や
(1..20).inject({}){|r,e| r[e]=e;r}
なら、その場に書ける。
0782nobodyさん2009/08/05(水) 03:46:34ID:???
>>781
前者は古いrubyだと動かないんじゃないか?
0783nobodyさん2009/08/05(水) 09:03:17ID:???
>>782
1.8.6だとアンドキュメンテッド(というかドキュメント化を忘れられ)
だが、動く。
07847832009/08/05(水) 09:04:35ID:???
動くと思ったが、Hash[*(...)] でないとうごかなかった。
ごめんなさい。
0785nobodyさん2009/08/05(水) 11:05:53ID:???
>>779-784
みなさまどうもありがとうございます
教えていただいた方法全て試したのですが、
<option value="16">16</option>
<option value="5">5</option>
<option value="11">11</option>
<option value="17">17</option>
のような結果になりうまくいきません。
なんか難しそうです。
0786nobodyさん2009/08/05(水) 11:27:13ID:???
やりたいことは
select 'foo', 'bar', 1..20
でたぶんできます。

確かに select の第3引数は Enumerable なら何でもいいけど、
基本的には Hash じゃなくて Array の Array を渡すものと考えといた方が良いよ。
0787nobodyさん2009/08/05(水) 11:33:58ID:NCOUlOL5
validates_length_ofってなんでバイト数じゃなくて文字数を見るようになったの?
バイト数の方がよかったんだけど・・

この仕様しらなかったせいでバリーデーション不備のまま本番にあげちゃってちょん切れたデータを多数テーブルに格納してしまった・・
0788nobodyさん2009/08/05(水) 11:57:44ID:???
mysqlだとtextとstringで違うとかもあった
07897802009/08/05(水) 12:16:04ID:???
>>785
ごめん。ハッシュじゃそりゃダメだわw
>>786 みたいにするか

[[label1, value1], [label2, value2], ...]

な配列を渡すんだ

http://api.rubyonrails.org/
0790nobodyさん2009/08/05(水) 14:14:24ID:???
>>786
そのやり方でできました!
ありがとうございます。
0791nobodyさん2009/08/05(水) 16:35:58ID:???
map.resource(s)で定義されるRESTfulなルーティング規則で呼び出される
アクション(indexとかshowとか)に対して、before_filterで、実行予定のア
クションが
- コレクションのアクション(index, newなど)
- メンバーのアクション(show, destroyなど)
のどちらなのかを判断する方法はないでしょうか。

標準のscaffoldで作られるもの以外にも対応したいので、
- index/new/createならコレクション
- show/edit/update/destroyはメンバー
という判定は避けたいです。

idパラメータの有無で判断するのが簡便に思えますが、誤判定の可能性
はないでしょうか。
07927772009/08/06(木) 00:16:21ID:???
>>777
テストのときだけ認証をスルーするようにした。
0793nobodyさん2009/08/06(木) 04:01:57ID:???
>>791
action_name 見りゃいいだけじゃ?
0794nobodyさん2009/08/06(木) 04:44:08ID:???
insert_html で、javascriptのコードをevalした結果を
insertしたりとかでけんのですかね?
いろいろと試してはみたのですが。
insert_html 'hoge', :bottom, :js => 'fuga' とか。
0795nobodyさん2009/08/06(木) 08:43:01ID:???
>>793
それはまさに>>791が避けたいと言っている方法では。
0796nobodyさん2009/08/06(木) 08:48:10ID:???
id以外にメンバを指定する方法を実装したら
それをどんどん判定条件に加えていけばいいような。
0797nobodyさん2009/08/06(木) 11:23:04ID:???
コレクションに対するアクションなのか、メンバーに対するアクションなのかは
アクションの実際の動作によるとしかいえないので、アクションの動作を
調べないかぎり誤判定はありえるでしょう。
つまりはコレクションかメンバーかは規約によるので、restという規約なら
アクションは予め決まっているので、それをaction_nameで判断すればいいのでは
ないでしょうか。
restのアクション以外を実装するケースを判断するには、そのアクションの対象が
コレクションかメンバーなのかは実装者にしかわからないでしょう。

0798nobodyさん2009/08/06(木) 13:22:51ID:???
resoucesメソッドの :collection => とか :member => とかを見れば
どうかと思ったが、その場でルーティング判定コードに変換されたらど
こにも残ってないな。
0799nobodyさん2009/08/06(木) 19:37:35ID:???
ActionMailerでお手紙だそうとしているんですが、タイトルが文字化けしてしまうの(´・ω・`)
文字化けしないようにするにはどうしたらいいんでしょうか?

config/enviroment.rbにて、

 config.action_mailer.default_charset = 'iso-2022-jp'

はすでに設定してあります。

下記サイトによると、2.3では大丈夫?みたいにあるのですが、大丈夫でないみたい・・・
Ruby on Rails - メール送信 - gendosuの企画開発室
http://gendosu.ddo.jp/redmine/wiki/1/%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%81%E4%BF%A1?export=txt&version=14

環境:Rails 2.3.2 Ruby 1.8.7
0800nobodyさん2009/08/06(木) 22:34:44ID:U5nTdGUe
受信者のタイトルの文字コードをまず書いてね。
0801nobodyさん2009/08/07(金) 01:36:44ID:???
メールにかけられた呪文「MIME〜前編」
http://www.atmarkit.co.jp/fnetwork/rensai/netpro03/netpro01.html
08027992009/08/07(金) 04:13:16ID:???
>>800
UTF-8になっているみたいでした…

>>801
よくよんでみます


ActionMailerのソースを見る限り、大丈夫じゃない感じだったので(元になったTMailはルーチンは残ってるんですが)、
下記サイトを参考に、gettext_rails入れてみます。

Rails2.3.2でiso-2022-jpのメールを送りつつテストも通るようにしてみた
http://doruby.kbmj.com/tn_on_rails/20090420/Rails2_3_2_iso-2022-jp_


2.3では大丈夫というのはどこの情報だろう…。リリースノートみても特に記述はない気がします
Ruby on Rails 2.3 Release Notes
http://guides.rubyonrails.org/2_3_release_notes.html
08037992009/08/07(金) 04:24:05ID:???
何度もすいませんw

日本語化はi18n使いたいし、メールのためだけにgettext入れるのもなんだかなーと思ってて調べていたら、
ActionMailerJaというのを見つけました。2.3にも対応しているみたいです。試してみようと思います。

ActionMailerで日本語のメールを送る方法 - yuum3のお仕事日記
http://d.hatena.ne.jp/yuum3/20090624/1245833142

ActionMailerJa - imishin.com
http://blog.imishin.com/projects/ruby/actionmailerja/


とりあえず、ありがとうございました。
0804nobodyさん2009/08/07(金) 17:05:39ID:???
ちょっとお聞きします。

form_forの
  <%= f.error_messages :header_tag => :h3 %>
のようなこういったコードを共通化したいのですが、どうするのがスマートでしょうか?

ヘルパーに引数でfを渡すのも考えたのですが、できれば、既存の
  <%= f.error_messages %>
で自動的に
  <%= f.error_messages :header_tag => :h3 %>
相当を呼ぶようにしたいのですが、よいはっく方法はないでしょうか?
0805nobodyさん2009/08/07(金) 18:18:25ID:???
そのコントローラのヘルパで、form_forを再定義して
error_messagesを再定義するようなモジュールをmixinすればいいんじゃない?
08068042009/08/08(土) 10:15:54ID:???
>>805
ありがとうございます。
うまいこと、再定義する方法ってないものでしょうか?

下記のようにすると、stack too deep?とか言われてしまいます。

module ActionView::Helpers
  class FormBuilder
    # デフォルトオプション付きの f.error_messages
    alias :old_error_messages, :error_messages
    def error_messages(option = {})
      old_error_messages({:header_tag => :h3}.merge(option))
    end
  end
end


今はとりあえず、別名で定義してみてあります。(grep置換してしまえばいいと言えばいいのですが…)
module ActionView::Helpers
 class FormBuilder
  # デフォルトオプション付きの f.error_messages
  def my_error_messages(option = {})
   error_messages({:header_tag => :h3}.merge(option))
  end
 end
end
08078042009/08/08(土) 10:17:37ID:???
さあああ、form_forをヘルパーで定義して、
以前のform_forを直接読んでやればよいのか…。
ちょっとやってみます。
0808nobodyさん2009/08/08(土) 12:34:13ID:???
>>806
なんていうか、既存のクラスを弄ってしまうのはなんかイヤなので、
class HogeHelper
 
0809nobodyさん2009/08/08(土) 12:47:11ID:???
途中投稿orz……

class HogeHelper
 module HogeBuilder
  def error_messages options
   super {:header_tag => :h3}.merge{option}
  end
 def form_for record_or_name_or_array, *args, &proc
  super do |f|
   f.extend HogeBuilder
   yield f
(ry
というのを考えてたんだが。
0810nobodyさん2009/08/08(土) 12:52:10ID:???
それがRubyの醍醐味じゃないか
0811nobodyさん2009/08/08(土) 13:21:01ID:???
インスタンスにmixinとかいうのも
それはそれでRuby的だよね
0812nobodyさん2009/08/10(月) 15:53:57ID:???
DBが2台あって、通常は1台のほうにアクセスし、
障害があったときにもう1台に切り替えるってできるのですか?

DBa, DBbで、普段はDBaのみに更新、参照し、DBaに障害があったら
DBbに更新、参照みたいな。

JavaのときはJDBCの接続のときに以下のようにするとできたんだけど、
Railsでもやりたいのです。

jdbc:mysql://DBa,DBb:3306/testdb
Properties prop = new Properties();
prop.put("autoReconnect", "true");
prop.put("roundRobinLoadBalance", "false");
prop.put("failOverReadOnly", "false");
....
0813nobodyさん2009/08/10(月) 22:13:10ID:???
できる
0814nobodyさん2009/08/11(火) 01:25:21ID:VNj7FetZ
railsでするって表現はどうかと思う。
Railsで扱えるDB(Mysql, PostgreSQL, Oracle, ...)が
812のいう機能をサポートしていればできる。

んで、大体のDBでできる。
08158122009/08/11(火) 11:43:12ID:???
>>813 >>814
返答ありがとうございます。

MySQLでお互いをMaster&Slaveにして、デュアルマスタにしているのですが、
片方死んだ時に切り替えたく思っています。
スレ違いになりそうですが、813さんと814さんの言ってることは
バーチャルIPかなんか振っておけってことでしょうか(DBサーバに)?
0816nobodyさん2009/08/11(火) 15:52:45ID:???
初期の管理ユーザーとかテストユーザーの登録みたいなプロダクション用の初期DBみたいのってどうやっておこうなうもんなんでしょうか?

・migrationに書く
・script/以下にスクリプト置いて、script/runnerで実行させる

migrationに書く方法だと、migrate後にdevelopment DBに db:fixtures:loadとかして開発用に初期DB入れようとすると、
migrationで入れたDBデータがぶっ飛んでしまいませんか?
0817nobodyさん2009/08/12(水) 08:25:01ID:???
xxx_fu って名前のプラグインが多いんだが、fu ってなんぞ?
fxck you の略?
0818nobodyさん2009/08/12(水) 11:09:05ID:???
カンフーのfu。「なんか東洋のすごい技」みたいなイメージで使われてる。
GIMPのScript-fuあたりが嚆矢かな。
0819nobodyさん2009/08/12(水) 11:50:53ID:???
☆ へぇへぇへぇー
   〃Λ_Λ
   ( ・∀・)
  ┏┓⊂ ⊂_)
`/ ̄ ̄ ̄ ̄ ̄ ̄/|
| ̄ ̄ ̄ ̄ ̄ ̄| |
|| ̄ ̄ ̄ ̄ ̄|| |
|| ┃┃┃ || |
|| ┃┗┫ || |
|| ┃ ┃ || |
||_____||/
└──────┘
0820nobodyさん2009/08/12(水) 12:22:42ID:???
Jargon Fileにも載ってるね。
ttp://www.catb.org/~esr/jargon/html/F/suffix-fu.html
直接の用法は「熟練の技」みたいな感じだが、
プラギンに使ってるのはおそらくノリというか面白半分だろうな。
0821nobodyさん2009/08/12(水) 19:16:22ID:???
>>816
db:fixtures:load RAILS_ENV=production
でいいんじゃないかと思います。
初期ユーザーなどは開発用にも必要なものだと思いますので、
それぞれの環境ごとに、しかし同じ方法でやるのがいいと思います。
0822nobodyさん2009/08/15(土) 02:11:01ID:3etX9jN1
>>815
Master 192.168.1.1, 192.168.1.2
Slave 192.168.1.3
こんな風にIP振っておいてクライアントは192.168.1.1にアクセスする。
SlaveがMasterの死を検出したら、
Slave 192.168.1.1, 192.168.1.3
ってする。クライアントは依然192.168.1.1にアクセスする。
ってやってるよ。
0823nobodyさん2009/08/15(土) 04:41:01ID:???
db:fixtures:load ってモデルのバリデーションかからないんじゃないの?
0824nobodyさん2009/08/15(土) 21:07:23ID:Ioyu6DB3
〜.rxmlのtemplateを作成して、xmlを出力してみたところ、
中の2バイト文字が全て?〜;の形式にエスケープされて出力されてしまいました。
このエスケープ処理を切るにはどのようにしたら良いのでしょうか。
よろしくお願いします。
0825nobodyさん2009/08/16(日) 05:33:13ID:???
誤検出とか、検出出来ずにうまく切り替えられない事も多いけどね。
あとIPアドレス振り直しは、ARPが書き変わるまでは通信不能。
デフォルトゲートウェイ設定の絡みで、同一サブネットだと、複数IP振っても特定のIPしか使われなかったりするけどな。
理論では、うまく逝きそうな仕組みも現実はそう簡単ではない事も多い。
0826nobodyさん2009/08/16(日) 06:52:43ID:???
>デフォルトゲートウェイ設定の絡みで、同一サブネットだと、複数IP振っても特定のIPしか使われなかったりするけどな。

kwsk (w
0827nobodyさん2009/08/16(日) 11:37:26ID:???
>>824
http://docs.komagata.org/4000
0828nobodyさん2009/08/16(日) 12:59:03ID:U2+68uzW
>>827
ありがとうございます。助かりました。
08298152009/08/17(月) 11:15:00ID:???
>>822
ありがとうございます。
hearbeatで構築しようと思います。
スレ違いにも関わらず返答頂き、助かりました
0830nobodyさん2009/08/18(火) 14:36:53ID:xQbi8Iqy
Rails.public_pathをtestの時だけ変更したいんですが・・・。
config/environments/test.rbに
Rails.public_path = RAILS_ROOT + "/test/public"
を追加してテスト環境モードでサーバを起動して、
http://localhost:3000/foo
にアクセスしても、RAILS_ROOT + "/public/foo"のファイルが見えてしまいます。

何かいい解決方法はないでしょうか。
0831nobodyさん2009/08/18(火) 17:53:06ID:???
>>830
apacheとかウェブサーバー側で操作すんじゃないの?
08328302009/08/18(火) 18:19:34ID:xQbi8Iqy
railsって特に設定しなくても
RAILD_ROOT + "/public"
を公開用ディレクトリとして認識してくれます。
んで、どこに設定されているんだろうかと調べていたら
Rails.public_pathという設定に行き着きました。
それだったらRails.public_pathに何か設定する方法があるだろうと思っています。
サーバ側の設定なんでしょうか?
仮にサーバだとしてRailsはいつRAILS_ROOTをサーバに渡すんでしょう。
0833nobodyさん2009/08/18(火) 18:27:06ID:???
夜になったらrails仙人が来るから、それまで待っててね
0834nobodyさん2009/08/18(火) 19:38:30ID:???
>>830
mongrel 使ってるんだよね?
08358302009/08/18(火) 20:26:23ID:xQbi8Iqy
そうです。
0836nobodyさん2009/08/19(水) 00:27:33ID:???
使ったことはないがmongrelなら「--prefix」というオプションがある
これに指定すればいけるんじゃないだろうか
時間がなくて試せないので、動作報告をくれるとうれしい
08378302009/08/19(水) 02:50:08ID:/4UU0U8g
--prefixは知っていますがうまく動作しません

mongrelで--prefixを指定したときはブラウザがアクセスするときのURLが変化します。
例えば、--prefixなしの時
http://localhost:3000/order
等としてアクセスしますが、--prefix=/fooをつけると
http://localhost:3000/foo/order
という風になります。
私の期待しているfilesystem上のPATHを変化させる方法ではありません
08388162009/08/19(水) 12:32:09ID:???
レスありがとうさんです。

fixtureに書く方法だと、どうしてもテスト用のデータになっちゃうんで、
結局、新たにmigration1個作ってそこに書く方法でやっちゃた。
0839nobodyさん2009/08/19(水) 13:22:08ID:???
質問があります。

viewのedit.html.erbのform_for内で入れ子にしようと fileds_for を使ったところ、
Hoge expected, got HashWithIndifferentAccess とか言われてオブジェクトの更新ができません。

belongs_toで関連付けた Hoge.my_hage= に Hashがそのまま代入されているようなのですが、
どうしたらよいものでしょうか?

構成は以下のようになってます

model: hoge.rb

class Hoge < ActiveRecord::Base
 belongs_to :my_hage, :class_name => "Hage"

view: edit.html.erb # /nested/hage/1234/edit

<% form_for([:nested, @hage]) do |f| %>
 <%= f.error_messages %>

 (略)

 <% f.fields_for :my_hage, @hoge.my_hage do |hage_form| %>
  <p>
   <%= hage_form.label :name%><br />
   <%= hage_form.text_area :name %>
  </p>
 <% end %>
 <%= f.submit '更新' %>
<% end %>
08408392009/08/19(水) 13:22:50ID:???
>>839のつづき

controller: nested/hage_controller.rb

 def update
  @hage = Hage.find(params[:id])

  respond_to do |format|
   if @hage.update_attributes(params[:question])
    flash[:notice] = 'Nested::Hage was successfully updated.'
    format.html { redirect_to(@hage) }
    format.xml { head :ok }
   else
    format.html { render :action => "edit" }
    format.xml { render :xml => @hage.errors, :status => :unprocessable_entity }
   end
  end
 end
08418392009/08/19(水) 14:31:14ID:???
>>839-840ですが、accepts_nested_attributes_for を使うことで解決いたしました。

class Hoge < ActiveRecord::Base
 belongs_to :my_hage, :class_name => "Hage"
 accepts_nested_attributes_for :my_hage

でOKでした。

以下が参考になりました。
Localization expected, got HashWithIndifferentAccess - Ruby Forum
http://www.ruby-forum.com/topic/184877


ありがとうございました。おさわがせしました。
0842nobodyさん2009/08/19(水) 15:02:29ID:???
>>837
うわ、すまんかった。
このオプションでいけるんじゃないだろうか。

--root PATH
Set the document root (default 'public')
0843nobodyさん2009/08/20(木) 20:29:11ID:OSASGkcC
>>120
遅レスですが、同じくWindows環境のattachment_fuで添付ファイルが壊れる現象起こりました。

で、対応としては>>126さんのアドバイスを参考にして
vendor\plugins\attachment_fu\lib\technoweenie\attachment_fu.rbの370行目辺り
File.read(temp_path)をFile.open(temp_path, "rb"){|f| f.read}に変更しました。

あと、メタデータのsizeが設定されたり、されなかったりという現象も起こったので
http://nonki.yoka-yoka.jp/d2009-07-09.htmlを参考にRuby\lib\ruby\1.8\tempfile.rbにも手を入れました。

以上で添付ファイルのDBへの格納、表示ともにうまくいっています。
0844nobodyさん2009/08/20(木) 22:42:43ID:???
マゾですかっwww
08458302009/08/23(日) 04:36:10ID:vSt0R6A2
>>842さんご紹介の--rootでうまくいきました。
mongrel_rails start -r test/public
でtest以下のpublicを読んでくれました。
0846nobodyさん2009/08/23(日) 09:17:36ID:???
Rails3っていつリリースされるって情報は出てないんですか?
0847nobodyさん2009/08/23(日) 15:34:00ID:???
先日のルビー会議でrails3をリリースするという情報はあったがそれ以降何も聞かんな
0848nobodyさん2009/08/27(木) 18:15:48ID:???
お聞きいたします。

他のモデルとコントローラー両方から参照したいあるモデル(User,UserSession)があります。

セッション情報やユーザー情報が何度も参照されるため、
下記のように簡易的にクラス変数でキャッシュみたいなことをしたのですが、
デプロイするproductionモードとローカルのdevelopmentでは全然違う挙動をします。
というか、productionモードではわけがわからない動作をします。

 def self.current_user
  return @@current_user if defined?(@@current_user)
  current_user_session = UserSession.current_user_session
  @@current_user = current_user_session && current_user_session.user
 end

productionモードでは、クラス変数が初期化されたりしない?ということまではわかった(つまり、クラス変数が使いまわされる)
のですが、代替の方法がよくわかりません。
どのように対処したものでしょうか?

Rails 2.3.2です。
0849nobodyさん2009/08/27(木) 18:21:54ID:???
Railsは頼むから前方互換性を高めてくれよん

PHPみたいなことはや(ry
0850nobodyさん2009/08/27(木) 18:24:52ID:???
Railsと比べればPHPのほうが遥かに互換性高いけど
0851nobodyさん2009/08/27(木) 20:24:29ID:???
yes
0852nobodyさん2009/08/27(木) 22:55:33ID:???
>>849
無駄に内部を弄るから互換性で苦しむはめになるんだよ
0853nobodyさん2009/08/28(金) 06:03:30ID:???
フレームワークと言語仕様を比べることに何の違和感も持ってないのか
0854nobodyさん2009/08/28(金) 06:51:07ID:???
>>853
同意。
PHPは言語で、Railsはフレームワーク。
比べるなら、PHPとRubyを比較するべきだよな。
まぁ、>>>849はそれすら分かっていないのかもしれないが。
0855nobodyさん2009/08/28(金) 10:44:15ID:???
849はPHPも知らない
知っているのは伝聞のFUD
■ このスレッドは過去ログ倉庫に格納されています