2016-06-23 54 views
0

新しいデータを作成しようとすると、次のエラーが表示されます。私はnew_room_event_path(1)ためlink_toをクリックすると、上記のエラーがRails:ActionController :: UrlGenerationError、一致するルートがありません。必要なキーがありません

ActionController::UrlGenerationError (No route matches {:room_id=>nil, :action=>"index", :controller=>"events"} missing required keys: [:room_id]): 

モデル

models/rooms.rb 

     has_many :events, inverse_of: :room, dependent: :destroy 
     has_many :amounts, inverse_of: :room, dependent: :destroy 
     accepts_nested_attributes_for :events, allow_destroy: true 

models/events.rb 

     has_one :amount, inverse_of: :schedule, dependent: :destroy 
     accepts_nested_attributes_for :amount, allow_destroy: true 

routes.rbを

... 
    resources :events,    only: [:new, :create, :edit, :update] 

    resources :rooms do 
    resources :events 
    end 

... 

が表示されます。 root/rooms/1/events/newを生成します。

<% if logged_in? %> 
     <% if current_user?(@user) %> 
     <% if schedule.rooms.blank? %> 
      <%= link_to "Add event", new_room_event_path(1), class: "btn btn-sn btn-primary" %> 
      <br> 
     <% end %> 
     <% end %> 
    <% end %> 

ビューは、私がnew_room_event_path(1)を指定する理由は、これは、データを作成するのは初めてであるということです。

events_controller.rb

before_action :load_room 

    def new 

    @event = Event.new 
    @event.room = @room 
    @event.build_amount 
    @event.amount.schedule = @room.schedule 
    @event.amount.room = @room 

    end 

    private 

    def load_room 
     if Room.exists?(id: params[:room_id]) 
     @room = Room.find(params[:room_id]) 
     else 
     @room = Room.new 
     end 
    end 

あなたが私にどんな提案を与えることができればそれは理解される可能性があります。

+0

少なくとも1つの部屋が作成されていますか?ハードコード値を渡しているようだから、私はこれを求めています... – SnehaT

答えて

0

まず、イベントをルームのネストされたリソースとして使用しているため、resources :events, only: [:new, :create, :edit, :update]をルートファイルから削除することをおすすめします。

第2に、存在しない部屋を作成している場合は、部屋を作成できる実際のnew_room_pathにそれらを送信する方が良いでしょう。また、希望する場合は入れ子にすることもできます新しい部屋の作成と同時にイベントを追加することができます。部屋がすでに存在する場合はそれがnew_room_event_path(room)

で設計されたとして、あなたは、ネストされたルートを使用することができ、あなたのイベントモデルから部屋への関連付けを欠落していたように見え、

# models/event.rb 

belongs_to :room 

を忘れてはいけないし、その後、あなたのEventsControllerから、あなたはこれを行うことができますし、

# controllers/events_controller.rb 

before_action :set_room 
before_action :set_event, only: [:show, :edit, :update, :destroy] 

private 

def set_room 
    @room = Room.find(params[:room_id]) 
end 

def set_event 
    @event = Event.find(params[:id]) 
end 

は、ネストされたリソースの詳細については、http://guides.rubyonrails.org/routing.html#nested-resourcesを参照してくださいnilの部屋を心配しないで

0

イベントコントローラーで、newアクションで@room = @event.roomに変更してください。あなたのエラーはroom_idを見つけることができないということです。あなたのコントローラに書いたように、あなたは@ event.roomを@roomに設定する新しい方法を求めていますが、メソッドが@ roomを見ていて、それが何であるか分かりません。 @room = @ event.roomと言うことで、新しい行為はあなたが既に上の行で理解しているように、@eventが何であるかを定義し、その@eventにroom_idを割り当てます。

関連する問題