2016-06-23 60 views
0

當我嘗試創建新數據時,顯示以下錯誤。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 

... 

當我點擊link_tonew_room_event_path(1),顯示上面的錯誤。 它生成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

它是否創建了至少一個房間?因爲你似乎在傳遞硬編碼價值,所以我問這個... – SnehaT

回答

0

首先,我建議您從路由文件中刪除resources :events, only: [:new, :create, :edit, :update],因爲您將事件用作房間下的嵌套資源。其次,如果您要創建一個不存在的房間,最好將它們發送到可以創建房間的實際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,詳細瞭解嵌套資源

0

在您的事件控制器的new操作中,將其更改爲@room = @event.room。你的錯誤是說它找不到room_id。你將它寫在你的控制器中的方式是要求你的新方法將@ event.room設置爲@room,但這是該方法第一次看到@room並且不知道它是什麼。通過說@room = @ event.room,新行動就像你已經知道的那樣,在上面的行中定義了什麼@event,並將room_id分配給了@event。

相關問題