我一直在练习这个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>
谢谢。
答案 0 :(得分:2)
您需要两件事才能完成这项工作:
这非常简单,您应该可以通过一点点Google搜索来找到它。最大的问题是,您是否实施了自己的用户管理,或者您是否正在使用Devise等管理它。
如果是Devise,请查看Rails Devise: get object of the currently logged in user?
如果你自己编写,你可以看看Devise或其他用户管理宝石如何提供对当前用户对象的访问。我会把它留给你,因为它似乎超出了你的问题的范围
这很简单,你有几个选择:
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文件夹。