[前][次][番号順一覧][スレッド一覧]

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...]