【问题标题】:How to show a view based on user attribute?如何根据用户属性显示视图?
【发布时间】:2016-10-20 12:24:15
【问题描述】:

在我的 Rails 应用程序中,我有一个包含产品和用户的商店。两者都有模型和控制器。 我想要实现的是根据他拥有的模型的属性在视图模板上向 current_user 显示产品。例如,如果用户具有来自用户模型的“女性”属性,然后显示与该属性相关的一些产品。我怎样才能做到这一点?

这些是我显示所有产品的产品视图:

<% @products.each do |product| %>
      <%= render "product_row", product: product, order_item: @order_item %>
    <% end %>

_product_row.html.erb

<h4><%= product.name %></small></h4>
  <div class="image">
     <%= image_tag product.image.url(:original), class: "img-responsive" %></div>

    <p>Some description.</p>

   <a href="/bag/<%= product.id %>", class="add-to-cart">Add to Package</a>

【问题讨论】:

    标签: ruby-on-rails ruby model-view-controller view


    【解决方案1】:

    听起来您需要根据 User 类的属性从产品类中检索对象。听起来像是一个基本的服务对象或只是用户的一个方法:

    class User < ActiveRecord::Base
      def products_for_gender
        if gender == 'female'
          Product.where("do some logic here based on female")
        elsif gender == 'male'
          Product.where("do some logic here based on male")
        else
          #do some other logic just in case it's nil
        end
      end
    end
    

    然后在您的控制器中执行此操作

    @products = current_user.products_for_gender
    

    在您看来,然后您会呈现包含这些产品的列表。这会阻止您将逻辑放在您的视图中,这很少是一个好主意。

    还有更多的抽象可能,if 语句不是最漂亮的,但我相信这将涵盖您的问题。最终你可以考虑使用服务对象,例如https://blog.engineyard.com/2014/keeping-your-rails-controllers-dry-with-services

    【讨论】:

    • 谢谢玛西恩! “在这里根据女性做一些逻辑”是什么意思?我应该把产品的属性放在那里还是?
    • 不,我的意思是我不知道您使用的是什么逻辑,基于您要过滤的产品属性?因此,如果性别是女性,则获取所有具有某些属性值的产品。 Product.where(attribute: "value"),这个由你决定,我不知道你的产品表中有什么属性
    • 我想谢谢你!你能告诉我,如果想包含来自不同列的多个属性怎么办?假设我想根据几个用户属性检索对象?不仅针对性别,还针对其他列,然后如果所有这些都与用户属性匹配以显示它们?
    • 当然这完全取决于用例。但是您当然可以添加更多 if 语句。在我正在处理的一个项目中,我们有很多不同的属性构成了我们加载的文章。例如,如果 current_user 具有 preferred_category 和 prefered_tag,您可以像这样查询Article.where(category: current_user.preferred_category, tag: current_user.prefered_tag) 我建议您阅读guides.rubyonrails.org/active_record_querying.html,了解如何查询活动记录资源。
    • 没问题,很高兴为您提供帮助 :) 您能否将答案标记为正确答案?
    【解决方案2】:

    您如何保存用户模型。如果您使用的是设计,那么您的视图中有 current_user 辅助方法可用,您可以使用它来获取 curren_user.gender 属性并基于此显示视图

    【讨论】:

    • 是的,我使用的是标准的 Devise 配置。我明白这一点,但是代码在视图中应该是什么样子?
    • 女性可以拥有什么样的产品由你决定,这更像是你在问题中没有提到的商业逻辑
    • 我在下面发布了一个答案,但阅读以下 SO 问题/答案也会对您有所帮助 stackoverflow.com/questions/60658/…
    猜你喜欢
    • 1970-01-01
    • 2012-01-27
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    相关资源
    最近更新 更多