堤です。
著者から返事がもらえるとは、感激です ^^
で、「:multipart => true」を確認したところ、特に問題はありませんでした。
下記に、そのコードをペーストします。
・app/views/schedules/new.rhtml
<%= start_form_tag :action => 'create', :multipart => true %>
・app/views/schedules/edit.rhtml
<%= start_form_tag :action => 'update', :id => @schedule, :multipart => true %>
そこで、development.log を調べてみました。
Processing SchedulesController#create (for
127.0.0.1 at 2006-07-21 13:06:54) [POST]
Session ID: 4700bdafe56195bb452faee22e4228ef
Parameters: {"schedule"=>{"datetime(4i)"=>"13", "datetime(5i)"=>"05", "title"=>"添付", "file_name"=>"PRE_nmnode.pdf", "content"=>"添付資料あり", "datetime(1i)"=>"2006", "datetime(2i)"=>"7", "datetime(3i)"=>"21"}, "commit"=>"作成", "multipart"=>"true", "action"=>"create", "controller"=>"schedules"}
NoMethodError (undefined method `original_filename' for "abc.pdf":String):
/app/controllers/schedules_controller.rb:98:in `set_file_name'
/app/controllers/schedules_controller.rb:24:in `create'
ログにも"multipart"=>"true"が記録されているので、問題はないかと思います。
私の環境はWinsowsなので、環境に問題があるのでしょうか?
ちなみに、「original_filename」の定義は下記のファイルにありました。
C:\ruby\lib\ruby\gems\1.8\gems\actionpack-1.12.3\lib\action_controller\cgi_ext\cgi_methods.rb
#ひょっとして、PATHとか関係あるのかな〜
こんにちは、かずひこです。
At Fri, 21 Jul 2006 09:35:03 +0900,
Hiroyuki Tsutsumi wrote:
> 「はじめようRuby on Rails」で学習しているのですが、
ありがとうございます。:)
> P117のoriginal_filenameでつまずいています。
>
> ブラウザからアクセスすると、「undefined method `original_filename'」と
> エラーになります。
> エラー個所は下記のところです。
>
> def set_file_name
> @file = params[:schedule][:file_name]
> params[:schedule][:file_name] = @file.original_filename
> end
ファイルのアップロードのように multipart で POST すると、String ではなく
StringIO(を拡張したもの)でクエリーがやってきて、そのインスタンスには
original_filename というメソッドがあるはずです。
なので、app/views/schedules/new.rhtml や app/views/schedules/edit.rhtml
の中で、start_form_tagメソッドの第二引数に「:multipart => true」の指定が
抜けているのではないかと想像します。
<%= start_form_tag(:action => 'create') %>
↑こうなっていたら、
<%= start_form_tag({:action => 'create'}, :multipart => true) %>
↑こう書き換えてください。
# 例しに、「:multipart => true」を削除してみたら、同じ例外になりました。
> Rubyのリファレンスマニュアルをみると、
> require "cgi"
> とあるのですが、これって何処に書き込めば良いでしょうか?
require "cgi" をする必要はなく、ActionPack の中で定義されています。私の環
境では
/usr/lib/ruby/gems/1.8/gems/actionpack- 1.12.3/lib/action_controller/cgi_ext/cgi_methods.rb
というファイルです。
--
かずひこ <http://wiki.fdiary.net/kazuhiko/>
「恋とハックはアジャイルが命!」
--
ML: rails@ruby.ml.fdiary.net
使い方: http://QuickML.com/