堤です。

著者から返事がもらえるとは、感激です ^^

で、「: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とか関係あるのかな〜

06/07/21 に Kazuhiko <kazuhiko@fdiary.net> さんは書きました:
こんにちは、かずひこです。

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/



--
-----
Hiroyuki Tsutsumi