动作显示从哈希而不是ID中查找值

时间:2015-10-17 06:10:23

标签: ruby-on-rails

我还在学习轨道并且已经做了很多阅读,但我不太清楚params如何显示'行动尚未奏效。

例如我们有UsersController,' index'操作向所有用户显示代码@user = User.all,并显示'通过使用代码@user = User.find(params[:id])

,操作正在调查每个用户

据我所知,他们都来自数据库,其中User是模型。

但是在我的方案中,如果我在视图中显示的数据不会通过数据库,而是在'索引'行动就是这样的 - @user = [{name => "alex"}, {name => "peter"}, {name => "john"}]

并在我的演出'动作,如何编写代码以便按名称查找用户?

3 个答案:

答案 0 :(得分:2)

在您的Rails应用中,您在视图中显示的数据不一定必须来自/通过数据库。您始终可以在视图中显示所需的任何数据。

例如,在您的index操作中,如果您有:

@users = [{name => "alex"}, {name => "peter"}, {name => "john"}]

然后,在index视图中,您只能通过遍历@users实例变量来显示这些用户。

同样适用于show页面。

如果要在show页面中按名称显示用户,则必须在实例变量中按名称设置用户,例如@users_by_name

@users_by_name = User.find_by(name: user_name)
# or you can hard code the values if you want like index action

然后这个@users_by_name实例变量将在您的show视图中可用,以便您可以遍历该变量并显示用户名。

最初,show页面用于显示特定的用户相关信息,但您可以根据惯例显示您想要的任何信息。

为了能够拥有这样的路线:localhost:3000/users/alex,它会显示用户alex的信息,您可以在routes.rb文件中添加路线:< / p>

get 'users/:name', to: "users#show"

并且,在您的控制器的show操作中,类似这样的内容:

 def show
   @user = User.find(params[:name])
 end

然后,在您的视图页面中显示@user信息。

P.S。通过名称查找用户不是一个好主意,因为在数据库中可能有多个具有相同名称的用户,并且在这种情况下会产生冲突/或提供错误的数据。

答案 1 :(得分:2)

在show action中,我们不是全部搜索用户特定记录。

因此,我们必须提供一些唯一标识符作为参数来查找特定记录。

例如。您的观点应与我们传递的参数类似,如下所示:

<% @user.each do |user| %><br>
  <%= link_to user.name, user_show_path+"?name="+user.name %><br>
<% end %><br>

在show action中,编写代码

def show
  @user = User.find_by(:name => params[:name])
end

同样在routes.rb中,编写以下代码:

get 'users/:name', to: "users#show"

对于上述解决方案,请确保名称字段是唯一的。

答案 2 :(得分:0)

  

我原来的问题是,如果有可能显示&#39;行动不通过数据库

不确定

如果你想要的话,你的节目动作如下:

#app/controllers/users_controller.rb
class UsersController < ApplicationController
   def show
      @user = "me"
   end
end

你真的不必在你的应用程序中做任何特定的事情,Rails只是一个框架,并且如果你希望它有效地工作,它有一定的约定。

您要问的是,您是否可以从第三方数据集中填充@user个对象...

... 是的,你可以 ......

这样做的方法是在模型中,而不是控制器:

#app/models/user.rb
class User < ActiveRecord::Base
   # populates from Hash
end 

然后,您可以再次从模型中填充控制器中的数据:

#app/controllers/users_controller.rb
class UsersController < ApplicationController
   def show
      @user = User.__________ #-> pull from your hash
   end
end
  

按名称查找用户

这很简单 - 只需将name传递给网址:url.com/users/marine_lorphelin

这会将:id参数设置为marine_lorphelin,您可以使用该参数在模型中查找名称:

#app/controllers/users_controller.rb
class UsersController < ApplicationController
   def show
      @user = User._______
   end
end

如果您使用的是包含用户模型的数据库,则可以使用以下内容:

def show
   @user = User.find_by name: params[:id]
end

由于您不是,您必须以某种方式将XML哈希附加到您的模型中。这个,我不知道没有具体内容,例如您从哪里获取数据,如何访问它,以及您要发送哪些路由来调用它。