[英]current_user in Model
我会说,我知道你不应该访问当前用户在模型调用开始。 但是我只是遇到了这样一种情况,因为代码现在就已经存在。 这就是为什么我要发布此问题-我需要了解有关如何执行此操作的最佳做法。
我的Nodes.rb中有一个方法需要访问current_user
才能产生正确的结果:
Node.rb
def tagged_users
tag_list = self.user_tag_list
email_tags = tag_list.select { |x| x.match("@") }
id_tags = tag_list.select { |x| x.match(/^[^@]*$/) }
users = User.where(email: email_tags, invitation_token: nil).where(id: current_user.memberships.pluck(:user_id).compact)
members_email = Member.where(email: email_tags).where(id: current_user.memberships.pluck(:member_id).compact)
members_id = Member.find_by_full_name(id_tags, current_user)
users + members_email + members_id
end
我必须在一些局部和集合上访问此实例方法,如下所示:
_user_tag_list.html.erb
<% node.tagged_users.each do |tag| %>
<div class="card-back__tagged-user">
<div class="tagged-user__avatar">
<img src="<%= avatar_url(tag) %>" alt="" class="tagged-user__photo">
</div>
<div class="tagged-user__title">
<h4 class="tagged-user__title-text"><%= tag.first_name %> <%= tag.last_name %></h4>
</div>
<%= link_to node_path(node, remove_tag: tag.first_name + ' ' + tag.last_name), class:'tagged-user__action', remote: true, method: :patch do %>
<i class="icon-close"></i>
<% end %>
</div>
<% end %>
从另一个部分调用
_node.html.erb
<div class="tagged_users">
<%= render partial: "nodes/user_tag_list", locals: {node: node} %>
</div>
tagged_users
也被称为在其他一些收藏品和js.erb的。 是否将其移至控制器,是否修改模型中的方法等? 您的答案将为您提供示例。 谢谢!
如果是我,我会将该方法移入自己的服务中,我更倾向于放置像这些模型这样的方法,因为我倾向于单一职责原则。
class TaggedUsers
def self.call(node, current_user)
tag_list = node.user_tag_list
email_tags = tag_list.select { |x| x.match("@") }
id_tags = tag_list.select { |x| x.match(/^[^@]*$/) }
users = User.where(email: email_tags, invitation_token: nil).where(id: current_user.memberships.pluck(:user_id).compact)
members_email = Member.where(email: email_tags).where(id: current_user.memberships.pluck(:member_id).compact)
members_id = Member.find_by_full_name(id_tags, current_user)
users + members_email + members_id
end
end
然后,在我的控制器中,我可以执行以下简单操作:
# NodesController (well, my guess at it :)).
def show
@node = Node.find(params[:id])
@tagged_users = TaggedUsers.call(@node, current_user)
# blah blah blah ... other code
end
在视图中,它将像“简单”一样:
= render partial: 'nodes/user_tag_list', locals: ( node: @node, tagged_users: @tagged_users }
或类似的东西...希望能有所帮助!
这很简单。 传递current_user
作为参数。
def tagged_users(current_user)
# ...
end
并在视图中使用它。
<% node.tagged_users(current_user)...
另外,您可以在Node
设置attr_accessor
。 但是我会让用户通过。
class Node
attr_accessor :current_user
end
然后,无论何时,它都是一个节点:
@node.current_user = current_user
理想情况下,将行为移动到另一个对象,例如服务或命令对象。 我认为craig.kaminsky的解决方案是一个不错的开始。
但是,如果您确实确实想在Node模型上保留此行为,则也可以重新定义Node#tagged_users
以接受current_user
参数: Node#tagged_users(current_user)
。 然后,您认为:
<% node.tagged_users(current_user).each do |tag| %>
这样就可以了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.