rails:1458
From: twata_nabe@y...
Date: Thu, 3 Aug 2006 22:29:45 +0900 (JST)
Subject: [rails:1458] Re: habtm で param を受け取る方法
片平様 わたなべです。 ご回答ありがとうございます。 実は以前のソースでparams[:service][:area_id]で登録できたのですが、 今回の問題は、仕様を追加した後にエラーが発生しました。 現在の仕様はこのようになっております。 【以前】 [View] [Controller] ------------------------------------------------------- 登録画面 regist.rhtml def regist 確認画面 confirm.rhtml def confirm ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 【現在】 [View] [Controller] ----------------------------------------------------------------- 登録画面 regist.rhtml(①-1) def regist(①-2) バリデートチェック - def get_regist(②-1) (チェック該当は ①-1にリダイレクト) 確認画面 confirm.rhtml(③-1) def confirm(③-2) 最初はModelクラスにバリデートをつければ事は済むと思ってましたが、 「ライドオンRails」を読み、「validateはsave!を実行してはじめて有効」 と書かれており、データベースに登録していない状態では有効ではないのか と思い、param変数を一度controllerに渡し、バリデートチェックをかける という仕様に変えました。 すると、habtmで持っていたAreaでエラーが起こりました。 以下、params[:service][:area_id]にしたときのエラーです。 ------エラー内容------------------------------------------------- undefined method `area_id=' for #<Service:0x3a58798> RAILS_ROOT: ./script/../config/.. C:/Program Files/ruby-1.8/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb:1789:in `method_missing' C:/Program Files/ruby-1.8/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb:1510:in `attributes=' C:/Program Files/ruby-1.8/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb:1509:in `attributes=' C:/Program Files/ruby-1.8/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb:1354:in `initialize_without_callbacks' C:/Program Files/ruby-1.8/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/callbacks.rb:236:in `initialize' #{RAILS_ROOT}/app/controllers/b_account_controller.rb:74:in `get_regist' Request Parameters: {"b"=>{"agreement"=>"1"}, "submit"=>"\346\254\241\343\201\270", "x"=>"17", "y"=>"7", "service"=>{"name_j"=>"sdfsdf", "companyname"=>"sdfsfs", "between_a"=>"", "between_b"=>"", "tel"=>"sdfds", "companyaddress"=>"555 Irving, San Francisco, CA", "website"=>"sdfsdf", "manager"=>"sdfsdfs", "area_id"=>"1", "name_e"=>"sdfsfs", "companytel"=>"sdfds", "chargerpost"=>"sfsdf", "charger"=>"sdfsdfs", "secretword"=>"sfsd", "address"=>"555 Irving, San Francisco, CA", "password"=>"aaaaa", "email"=>"sdfsd", "membertype_id"=>"4", "industry_id"=>"1"}, "password"=>{"confirm_password"=>"aaaaa"}, "select"=>"\343\201\212\346\257\215\343\201\225\343\202\223\343\201\256\346\227\247\345\247\223"} ------------------------------------------------------------------------------------------------ params[:service][:area_id]を 変えることでエラーはなくなるのかなと思い、 params[:service][:area_ids]にすると、 undefined method `area_id='ではなく、 Couldn't find Area without an ID になったわけです。 片平さんのおっしゃるように、paramsがうまく機能していないのかなと思ってます。 ソース全部を載せると読みづらくなるので、該当箇所のソースを掲載します。 登録画面 regist.rhtml(①-1) def regist(①-2) バリデートチェック - def get_regist(②-1) 確認画面 confirm.rhtml(③-1) def confirm(③-2) ■①-1 <!--rails start--> <select id="service_area_id" name="service[area_id]"> <% for area in @area %> <option value="<%= area.id %>"><%=h area.id %></option> <% end %> </select> <!--rails end--> ■①-2 def regist @area = Area.find(:all) ~以下略 ■②-1 def get_regist session[:service] = Service.new(params[:service]) #入力チェック if params[:service][:name_e] == "" || params[:service][:charger] == "" || params[:service][:chargerpost] == "" || params[:service][:e_mail] == "" || params[:service][:password] == "" || params[:service][:address] == "" || params[:service][:tel] == "" || params[:service][:manager] == "" || params[:service][:companyname] == "" || params[:service][:companytel] == "" || params[:service][:website] == "" if params[:service][:name_e] == "" flash[:notice_name_e] = "店名(英語)を入力してください" end if params[:service][:charger] == "" flash[:notice_charger] = "担当者を入力してください" end ~途中略 redirect_to :action => "regist",:membertype => params[:service][:membertype_id] return else redirect_to :action => "confirm",:membertype => params[:service][:membertype_id] end ■③-1 <!--rails start--> <td class="txt12nosp"><%= @area_name %></td> <input id="service_area_id" name="service[area_ids][]" type="hidden" value=<%= @params["service"]["area_ids"] %> /> <!--rails end--> ■③-2 def confirm @area_name=Area.find(params[:service][:area_ids]).collect { |area| area.name } #@area_name = Area.find(params[:service][:area_ids]).name #ご教示いただいた方法を試しましたが、Couldn't find Area without an ID #でエラーが発生しました。やはりparamsの指定方法が間違っているのかなと #思ってます。 #ソース終了 このような確認画面がある場合でもModelクラスで指定するvalidateが 有効になる方法がございましたら、ご教示願います。 --------------------------------- Let's start Yahoo! Auction - Free Campaign Now!
@ 1447 2006-08-02 23:29 [twata_nabe@y... ] habtm で param を受け取る方法 1456 2006-08-03 04:55 ┗[yuichi_katahira@m...] 1457 2006-08-03 05:01 ┗[yuichi_katahira@m...] -> @ 1458 2006-08-03 15:29 ┗[twata_nabe@y... ] @ 1459 2006-08-03 15:38 ┣[twata_nabe@y... ] 1461 2006-08-04 04:26 ┗[yuichi_katahira@m...]