繁体   English   中英

模型中的current_user

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM