Rails 4 - 无法找到没有ID的用户

时间:2015-10-16 20:27:44

标签: ruby-on-rails ruby-on-rails-4

我是铁杆新手,所以任何解释&建议非常感谢。

  • 我有一个网页,其中我希望任何user查看该页面而不仅仅是current_user,但我不确定如何在我的控制器中正确定义实例变量@user
  • 在我的static_pages_controller.rb我有以下操作recruiterpg

static_pages_controller.rb

  def recruiterpg
    @user = User.find(params[:user_id])
    @adverts = @user.adverts
    @applications = @user.forms
  end
  • 在我的控制器中,我已将user定义为@user = User.find(params[:user_id]),但这会破坏我在视图中的代码; views/static_pages/recruiterpg.html.erb

  • 当我将user定义为@user = current_user时,我的视图中的代码完全正常

  

我想要做的是:对于我的观点,recruiterpg.html.erb,我想   任何user都可以查看该页面,而不仅仅是current_user   查看页面。能有人劝告我并向我解释如何   在我的@user中正确定义status_pages_controller.rb。我也   尝试了@user = User.find(params[:id]),但我的代码仍然在   views - 我收到错误消息

Couldn't find User without an ID

3 个答案:

答案 0 :(得分:2)

您需要确保将user_id传递给recruiterpg操作。例如,在浏览器中尝试此URL(将user_id设置为split表中的已知ID):

http://localhost:3000/dashboard?user_id=1

建议修改您的操作:

'1234.12'.split('.')

答案 1 :(得分:2)

如果未定义params [:user_id],您希望找到一种方法来显示正在定义 的内容。

如果将以下语句抛出控制器......

def recruiterpg
  ...
  puts params
  ...
end

...当您加载页面时,您应该会在控制台中看到类似以下内容的内容......

{"controller"=>"static_pages", "action"=>"recruiterpg", "id"=>"49"}

查看the Rails参数指南。它们可以通过三种方式之一进行定义。

One:作为查询字符串,类似于Sean上面的回答。

二:路由参数。请参阅Rails指南中的第4.3节。在您的情况下,这意味着您应该在routes.rb中具有以下内容:

get '/dashboard/:user_id' => 'staticpages#recruiterpg'

请注意,该字符串中的:user_id没有任何魔力。

三:来自表格,这似乎不适用于此处,因为用户没有提交数据。

答案 2 :(得分:1)

由于您是新手,以下是您的一些信息:

用户素材

首先,解决错误的最佳方法是识别您的user story

A"用户故事"是一个软件原则,您可以在其中放置用户的观点"首先 - 解释软件应如何在用户如何使用它的条件下工作。

您的问题的一个主要问题是您的用户故事非常薄弱;很难解决你想要实现的目标。

下次您提出问题时,在提供代码段之前,您应该尽力描述用户应该如何查看您的应用:)

<强>控制器

您的主要问题是antipattern

反模式基本上是&#34; hack&#34;这可能会在将来破坏你应用的另一部分。有点像软件的胶带):

#app/controllers/static_pages_controller.rb
class StaticPagesController < ApplicationController
    def recruiterpg
      @user = User.find(params[:user_id])
      @adverts = @user.adverts
      @applications = @user.forms
    end
end

所以您要显示静态页面,但是您想用数据填充它吗?

嗯...

#config/routes.rb
resources :users do
   resources :recruiters, only: :index #-> url.com/users/:user_id/recruiters
end

#app/controllers/recruiters_controller.rb
class RecruitersController < ApplicationController
   def index
      @user = User.find params[:user_id]
      @adverts = @user.adverts
      @applications = @user.forms
   end
end

这将允许您填充以下视图:

#app/views/recruiters/index.html.erb
<%= @adverts %>

-

在此处注意控制器/路由的结构非常重要。

您遇到的问题是您正在调用静态页面&#34;并希望有可用的params来找到User。如果您有可用的参数,则会发生...

<强> PARAMS

Rails不是魔术,因此如果你想查找用户,你必须提供这样做的参数。

这就是您能够查找current_user的原因 - 已经为此用户设置了参数。

因此,您需要使用名为nested routes的内容来获取<{1}}的用户ID 其他

current_user