2011-01-08 1 views
2

私はこれを一日中デバッグしています。 私のアプリケーションには2つのモデルがあります:teaClass &お茶。ティーラス.rbで、私は持っていますbelongs_toとhas_manyを正しく使うにはどうすればいいですか?

has_many :teas 

私は 'belongs_to:teaclass`を持っています。

私はこの"..teaclasses/:id/teas/:id";がそうteas_controller.rbで、私はbefore_filter :get_teaClass

def show 
@tea = @teaclass.teas.find(params[:id]) 

respond_to do |format| 
    format.html # show.html.erb 
    format.xml { render :xml => @tea } 
end 
end 

def new 
if @teaclass.teas 
    @tea = @teaclass.teas.new 
    @teaclass.teas << @tea 
    #@tea = Tea.new 
    else 
     flash[:notice=>"failed"] 
     @tea = Tea.new 
     @teaclass.teas << @tea 
    end 
respond_to do |format| 
    format.html # new.html.erb 
    format.xml { render :xml => @tea } 
end 
end 

def get_teaClass 
    begin 
     @teaclass = Teaclass.find(params[:teaclass_id])rescue 
     redirect_to teaclass_path, :notice => "Teaclass Required!" 
    end 
end 

を置くしかし、私は "未知の属性を:teaclass_id" というエラーを取得しておくようなURLが見えるようにしよう

/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:2906:inassign_attributes' 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:2902:in `each' 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:2902:in `assign_attributes' 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:2474:in `initialize' 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/associations/association_collection.rb:380:in `new' 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/associations/association_collection.rb:380:in `send' 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/associations/association_collection.rb:380:in `method_missing' 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:2178:in `with_scope' 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/associations/association_proxy.rb:207:in `send' 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/associations/association_proxy.rb:207:in `with_scope' 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/associations/association_collection.rb:376:in `method_missing' 
/home/jianpchen/repo/Teashop/app/controllers/teas_controller.rb:31:in `new' 

缶誰私を助けてくれない?ありがとうございました。

+0

すべてのコードが正しいことを確認してから、 – s84

+0

編集に感謝します:D – jchenjc

答えて

3

私はURLは、この「..teaclasses /のように見えるようにしよう:ID /紅茶/:ID ";そうteas_controller.rbに、私はbefore_filterを置く:あなたは、ネストされたルートの設定ですが、idを取得しようとしている場合、あなたはそれをやっているようget_teaClass

これだけの問題では鳴りません。

実際に行う必要があるのは、データベースに外部IDを追加することです。したがって、schema.rbにチェックを入れ、その列が存在することを確認してください。

ここにあなたがする必要があります。

  1. データベーステーブルteaに実際に異物があることを確認してください。
  2. 次の手順に進むと、コードを書くためのより良い方法が示されます。
  3. 'tea_class_id'を整数型の値として 'tea'テーブルに追加しない場合は、追加する必要があります。
  4. すくいデシベル
  5. スクリプト生成/移行add_tea_class_id_to_tea:
  6. を移行するには、今、これはあなたのコードは

routes.rbを

map.resources :teas 
map.resources :teas_classes 

モデル

を書かれるべきかである

モデル/ tea.rb

class Tea < ActiveRecord::Base 
    belongs_to :tea_class 
end 

tea_class.rb

class TeaClass < ActiveRecord::Base 
    has_many :teas 
end 

コントローラ

teas_controller。RB

def new 
    @tea = Tea.new 
end 

def show 
    @tea = tea.find(params[:id) 
end 

def create 
    @tea = Tea.new(params[:tea]) 
    if @tea.save 
     redirect_to teas_path 
    else 
     render :action => 'new' 
    end 
end 

ビュー

これは本当に重要です。お茶を作るときにパラメータとしてtea_class_idを渡していることを確認してください。それ以外の場合は、関連付けの仕方がわかりません。あなたがparams[:tea]を送ってくるので、それはちょっと後ろにありますが、それは実際にtea_class_idが送られるそれらのパラメータにあります。

あなたの意見では、ユーザーがカテゴリを選択するための方法やティークラスを持つ必要があります。これは通常、1対多の関連である場合に選択ボックスで行われます。

new.html.erb

<% form_for(@tea) do |t| %> 
    <%= t.collection_select :tea_class_id TeaClass.all, :id, :name %> 
<% end %> 

あなたが実際にcollection_select方法を埋めるためにお茶のクラスを持っていることを確認してください。あなたが何が起こっているのかわからない場合は、GoogleにプラスのレールAPIを付けてください。

(側)

ネストされたルートは、あなたがteaclasses/:id/teas/:idのようなルートを取得しようとしていたように見えました。これは、ネストされたルーティングと呼ばれ、あなたは、あなたがteas_classes/pour/teas/chineseにリンクすることができ、あなたのroutes.rbを

map.resources :tea_classes_ do |tea_classes| 
    tea_classes :teas 
end 
map.resources :teas 

にそれを設定したいと思うでしょう。このコマンドはrake routesです。パスの仕組みを理解するのに役立ちます。

しかし、あなたはちょうどこのようにする必要があり、それを軌道に乗るためにリンクをしたい場合:

あなたは、それはそれからIDを取り、あなたがクリックしたときにそれがそれを与えるので、リンクを行う@teasを供給する必要がある
<%= link_to "Teas", tea_classes_teas_path(@tea_class)%> 

teas_controller' as params [:teas_class_id] `。あなたは何もする必要はありません。それは自動的にURLになります。

+0

ありがとう、ありがとうございます。私はTeaテーブルに外来キーを持っていない、それが主要な問題です。私は自分のモデルを足場にし、関連するモデルファイルに "has_many"と "belongs_to"をタイプしました。私はレールがすべてのデータベース関係を作成するすべての魔法をやると思った。明らかに、レールはそれをしません。また、外部キーやその他のものを自動的に(足場のように)生成する素早い方法はありますか? – jchenjc

+0

script/generate scaffold name:string teas_class_id:整数 – s84

+0

スキャフォールドとして実行し、必要なIDでマイグレーションを生成します。 – s84

0

ログを見ると、paramsに含まれているものが表示されます。あなたのコードと説明が与えられたら、teaclass_idというキーはparamsにありません。おそらくあなたが探しているのは:id。アクセスしたい場合:teaclass_idを、あなたはおそらく、あなたのルートにそれを設定する必要があります

match 'controller/:teaclass_id' => 'controller#show' 
関連する問題