2016-06-23 38 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。

相关问题