【问题标题】:Rails4 - How to access constants in a view and display them correctly?Rails4 - 如何访问视图中的常量并正确显示它们?
【发布时间】:2015-01-11 20:57:10
【问题描述】:

我的用户模型中有如下常量

app/models/user.rb

GENDER_TYPES = [['Male', false], ['Female', true]]
COUNTRY_TYPES = [["Afghanistan",1],["Aland Islands",2],["Albania",3]..]

在用户注册页面等视图中,我按如下方式访问它们

  <div>
  <%= f.label :is_female, "Gender" %>
  <%= f.select :is_female,  User::GENDER_TYPES , {}, { :class => 'form-control' } %>
  </div>

  <div>
  <%= f.label :country, "From" %>
  <%= f.select :country,  User::COUNTRY_TYPES , {}, { :class => 'form-control' } %>
  </div>   

这是我的用户模型的一部分

class AddAdminToUsers < ActiveRecord::Migration
  def change    

    add_column :users, :is_female, :boolean, default: false   
    add_column :users, :country, :integer

  end
end

当用户注册时,我可以将数据存储在表中。 但是当我在视图中显示用户时,我使用的是这样的性别

  <% if user.is_female %>
    <small>Female</small>
  <% else %>
    <small>Male</small>
  <% end %>

而且我不知道如何为国家做这件事。 我知道必须有更好的方法来做到这一点。

有人可以分享如何显示具有上述数据结构的用户的性别和国家吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4


    【解决方案1】:

    可能不完美,但会完成工作

    <%= User::COUNTRY_TYPES.map(&:reverse).to_h[user.country] %>
    

    最好将国家保存在另一个表中,并引用它。

    【讨论】:

    • 谢谢。我会试试这个。但是我采用了这种方法,以便可以停止数据库访问。我有一个视图,用户可以在其中看到所有其他用户。我想如果我将国家/地区保存在数据库中,那么每个用户都可以访问数据库。例如,如果一个页面显示 30 个用户,那么不会有 30 个用户访问数据库吗?对不起,我是新手。如果我错了,请纠正我。
    • @LovingRails 你是半正确的,你所描述的被称为 N+1 问题,rails 可以让你避免它:User.includes(:countries).all,将生成 2 个数据库查询并为每个查询附加相应的国家选定的用户。更多细节在这里:codemy.net/posts/optimizing-your-rails-app-part-1-n-1-queries
    • 您可以在获取用户时预先加载国家/地区,这会将查询数限制为 2。
    【解决方案2】:

    假设您已经习惯将数据保存在常量中,这里有一些提示:

    • 使用哈希:COUNTRIES = {1 =&gt; "Afghanistan"},如有必要,您可以轻松地将其转换为对数组,并且您可以轻松地以两种方式查找值:
    <% if user.country %>
      <%= User::COUNTRIES[user.country] %>
    <% end %>
    
    • 使用助手来呈现原始数据,而不是直接引用模型常量,当您想要进行作为呈现的一部分而不是业务逻辑的翻译时,它也很有用:
    def coutries_for_select
      # assuming countries is a hash id => name
      User::COUNTRIES.map {|id, name| [name, id]}
    end
    

    【讨论】:

      猜你喜欢
      • 2020-02-18
      • 1970-01-01
      • 2012-11-15
      • 2020-01-31
      • 2015-03-20
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多