Ruby on rails Rails4-如何访问视图中的常量并正确显示它们?

Ruby on rails Rails4-如何访问视图中的常量并正确显示它们?,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,在我的用户模型中有如下常量 class AddAdminToUsers < ActiveRecord::Migration def change add_column :users, :is_female, :boolean, default: false add_column :users, :country, :integer end end app/models/user.rb GENDER_TYPES = [['Male', false]

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

class AddAdminToUsers < ActiveRecord::Migration
  def change    

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

  end
end
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
类AddAdminToUsers 当用户注册时,我可以将数据存储在表中。 但是当我在视图中显示一个用户时,我使用了类似这样的方法来表示性别

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

女性
男性
我不知道如何为国家做这件事。 我知道一定有更好的办法


有人能分享一下如何显示用户的性别和拥有上述数据结构的国家吗?

可能并不完美,但可以完成这项工作

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


最好将国家/地区保存在另一个表中,并将其引用。

假设您已决定将数据保存在常量中,以下是一些提示:

  • 使用哈希:
    COUNTRIES={1=>“Afghanistan”}
    ,如果需要,您可以轻松地将其转换为成对数组,并且可以轻松地以两种方式查找值:

谢谢我试试这个。但我采用这种方法是为了阻止数据库访问。我有一个用户可以看到所有其他用户的视图。我想如果我把国家保存在数据库中,那么每个用户都可以访问数据库。例如,如果一个页面显示30个用户,那么30个用户是否可以访问数据库?对不起,我是新手。如果我错了,请纠正我。@LovingRails您是半对的,您描述的是所谓的N+1问题,rails允许您避免它:
User.includes(:countries)。所有
,将生成2个数据库查询,并将相应的国家附加到每个选定的用户。这里有更多详细信息:您可以在获取用户时立即加载国家,这将把查询数量限制为2。
def coutries_for_select
  # assuming countries is a hash id => name
  User::COUNTRIES.map {|id, name| [name, id]}
end