2014-10-06 57 views
2

我刚刚看过Railscasts pro第250集,我不明白一件事。我说说这行:辅助方法中的参数

<%= link_to "Log out", session_path("whatever"), method: 'delete' %> 

作者说,这样的事情:

session path helper method can expect an id to be passed through here

我的控制器动作:

def destroy 
    session[:user_id] = nil 
    redirect_to root_path, notice: "Looged out" 
    end 

在我route.rb文件:

resources :sessions 

为什么我不能通过<%= link_to "Log out", session_path(), method: 'delete' %>?当我这样做时,我收到一个错误:

No route matches {:action=>"show", :controller=>"sessions"} missing required keys: [:id]

为什么需要id在这里?

毕竟我没有在任何地方使用这个参数。

回答

3

当我们定义了一个控制器的路线,我们添加此以下行路线文件

resources :sessions 

上面这条线,暗中创建7个默认路由

         sessions GET  /sessions(.:format)                 sessions#index 
               POST  /sessions(.:format)                 sessions#create 
            new_session GET  /sessions/new(.:format)                sessions#new 
           edit_session GET  /sessions/:id/edit(.:format)              sessions#edit 
             session GET  /sessions/:id(.:format)                sessions#show 
               PUT  /sessions/:id(.:format)                sessions#update 
               DELETE /sessions/:id(.:format)                sessions#destroy 

这里,为destroy行动路线是/sessions/:id(.:format)DELETE方法。由于url需要url中的:id,所以您需要发送一些id。 ID意味着它不应该只是整数,它可以是任何像字符串。因此,他们在删除会话时使用该网址中的“无论”。

1

该路线是执行缺少的id。我看不到你的代码的其余部分,但你可能有地方的路线,看起来像这样:

session GET /sessions/:id(.:format)   sessions#show 

这条路线,您需要调用它,用一个id。

+0

谢谢。我在'route.rb'中使用'resources:sessions' – Jensky 2014-10-06 07:33:35

+0

你可以添加一个新的路由或者只是传递任何东西(例如'whatever')到'session_path()'中以满足参数要求。 – 2014-10-06 07:38:18