Rails 4如何使页面显示用户的狗列表

时间:2015-10-13 03:05:29

标签: ruby-on-rails activerecord

我一直在练习这个rails应用程序,我希望允许注册用户提供他们的狗的配置文件。但我无法通过My Dogs页面显示仅属于当前登录用户的狗。

我已经通过Active Record(用户has_many:狗,Dog belongs_to:用户)链接了狗和用户模型但我不知道在我的dogmenu视图中键入什么以仅显示属于当前的狗登录用户。这就是我到目前为止所做的:

views \ access \ dogmenu.html.erb< - 请注意,将显示当前登录用户的狗的页面位于另一个控制器的视图中。

<div id="dogdisplay">
  <table>
<tr>
  <th>Dog Name</th>
  <th>Breed</th>
</tr>
<% Dog.all.each do |d| %>
<tr>
  <td><%= link_to d.dname, d %></td>
  <td><%= d.breed %></td>
  <td><%= link_to "Edit", edit_dog_path(d) %></td>
  <td><%= link_to "Delete", d, method: :delete %></td>
</tr>
<% end %>
</table>
</div>

谢谢。

4 个答案:

答案 0 :(得分:2)

您需要两件事才能完成这项工作:

  1. 登录用户的用户对象
  2. 根据该ID
  3. 过滤狗列表

    1。当前用户

    这非常简单,您应该可以通过一点点Google搜索来找到它。最大的问题是,您是否实施了自己的用户管理,或者您是否正在使用Devise等管理它。

    如果是Devise,请查看Rails Devise: get object of the currently logged in user?

    如果你自己编写,你可以看看Devise或其他用户管理宝石如何提供对当前用户对象的访问。我会把它留给你,因为它似乎超出了你的问题的范围

    2。过滤狗列表

    这很简单,你有几个选择:

    从视图

    current_user.dogs.each do |d|
    
    Dog.where(user: current_user).each do |d|
    
    Dog.where(user_id: current_user.id).each do |d|
    

    来自控制器

    @Sean Huber建议更清洁 - 使用上述任何方法,但是使用控制器。例如。

    @dogs = current_user.dogs
    

    简而言之,只接受用户ID与当前用户匹配的狗。

答案 1 :(得分:1)

我建议你在控制器动作中为当前用户的狗设置一个实例变量。像这样:

def dogmenu
  # this assumes you have a current_user already defined
  @dogs = current_user.dogs
end

然后切换视图以使用实例变量@dogs

<div id="dogdisplay">
  <table>
<tr>
  <th>Dog Name</th>
  <th>Breed</th>
</tr>
<% @dogs.each do |d| %>
<tr>
  <td><%= link_to d.dname, d %></td>
  <td><%= d.breed %></td>
  <td><%= link_to "Edit", edit_dog_path(d) %></td>
  <td><%= link_to "Delete", d, method: :delete %></td>
</tr>
<% end %>
</table>
</div>

答案 2 :(得分:0)

要获取当前的用户狗,您可以使用对象current_user 改变这个 的控制器

def dogmenu
  @dogs = current_user.dogs
end

查看

<% @dogs.each do |d| %>

要使current_user可以在视图中执行一个帮助方法。

class ApplicationController < ActionController::Base
  helper_method :current_user

  def current_user
    @current_user ||= User.find_by_id(session[:user])
  end
end

最后,您可以在视图或助手中使用current_user

<% current_user.dogs.each do |d| %>
<tr>
  <td><%= link_to d.dname, d %></td>
  <td><%= d.breed %></td>
  <td><%= link_to "Edit", edit_dog_path(d) %></td>
  <td><%= link_to "Delete", d, method: :delete %></td>
</tr>
<% end %>

尝试第一个使用实例变量的方法很有用。希望它可以提供帮助。

答案 3 :(得分:0)

您需要检索与当前用户相关的狗。由于这些是用户的狗,逻辑应该位于UsersController

在_controller / users_controller.rb _

def your_method_name
    @user = User.find(current_user.id)
    @dogs = @user.dogs
   render :dogmenu
end

然后在 views / users / dogmenu.html.erb

<div id="dogdisplay">
  <table>
<tr>
  <th>Dog Name</th>
  <th>Breed</th>
</tr>
<% @dogs.each do |d| %>
<tr>
  <td><%= link_to d.dname, d %></td>
  <td><%= d.breed %></td>
  <td><%= link_to "Edit", edit_dog_path(d) %></td>
  <td><%= link_to "Delete", d, method: :delete %></td>
</tr>
<% end %>
</table>
</div>

这些是用户狗,因此视图确实属于users文件夹。