Ruby on Rails - 添加新的控制器方法

时间:2014-08-25 15:18:49

标签: ruby-on-rails ruby routes

我希望能够在我的UsersController中添加一个名为home的新方法。

现在控制器有这个

  def home
    @user = User.find(params[:id])
  end

我在路线文件

上添加了这个
  match '/user_home', to: 'users#home', via: 'get'

我在users文件夹上创建了View home.html.erb。

我收到了这个错误:

无法找到没有ID的用户。

有人可以帮助我吗?

4 个答案:

答案 0 :(得分:4)

替代方法:

resources :users do
  member do
    get 'home'
  end
end

这样您就可以获得路线/users/:id/homemember关键字可以确保块中定义的操作的ID。

您可以在Rails指南中了解有关路由的更多信息 - http://guides.rubyonrails.org/routing.html#adding-more-restful-actions

答案 1 :(得分:0)

您需要指定该路径有一个' id'参数at。

match '/user_home/:id', to: 'users#home', via: 'get'

您还应该添加' id'您尝试访问的链接的参数。

例如:localhost/user_home/16

Further reading

答案 2 :(得分:0)

这是因为params [:id]的值是nil,因为你没有发送任何用户的id:因此,“find”方法会抛出一个ActiveRecord :: RecordNotFound,因为它需要一个真实的id才能找到用户

如果您不希望home方法抛出错误,可以使用“find_by_id”方法:

def home
    @user = User.find_by_id(params[:id])
end

但是如果你想传递一个id(应该是这种情况),你应该使用:

match '/user_home/:id', to: 'users#home', via: 'get'

然后Rails将识别您网址中的“id”部分,并将其传递给参数。

答案 3 :(得分:0)

如果不更新您的路线以包含:id,则必须使用以下网址:

/user_home?id=21

如果你想要一个自定义路径助手,可以这样:

match '/user_home/:id' => 'users#home', via: :get, as: 'user_home'

然后你可以使用:

<%= user_home_path(22) %>

<%= user_home_path(id: 23) %>
在您的观点中

或者是完全合格的路径:

<%= user_home_url(id: 23) %>