如何根据用户属性显示视图?

时间:2016-06-18 22:49:10

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

在我的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>

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如何保存用户模型。如果您正在使用devise,那么您的视图中可以使用current_user帮助方法,您可以使用它来获取curren_user.gender属性并根据此显示视图