如何在其他视图中显示Rails选择字段值而不是存储的整数

时间:2012-02-19 07:23:58

标签: ruby-on-rails

我在Rails应用程序中使用了一个未绑定到相关模型的选择字段,但存储了一系列静态选项的整数值,即

<%= select (:this_model, :this_field, [['Option1',1],['Option2',2],['Option3',3],['Option4',4]] ) %>

在show / index视图中,如果我想显示选项文本(即Option1,Option2等)而不是存储在数据库中的整数值,我该如何实现?

感谢您帮助一个菜鸟学习绳索!

修改

根据Thorsten的建议,我实施了以下内容。但它返回零,我无法弄清楚原因。

发票模型:

@@payment_status_data = { 1 => "Pending Invoice" , 2 => "Invoiced" , 3 => "Deposit Received", 4 => "Paid in Full"}

  def text_for_payment_status
     @@payment_status_data[payment_status]
  end

发票显示视图​​:

Payment Status: <%= @invoice.text_for_payment_status %>

在控制台中:

irb > i=Invoice.find(4)
=> [#<Invoice id: 4, payment_status: 1 >]
irb > i.text_for_payment_status
=> nil

我尝试在键周围使用和不使用引号来定义哈希。我错过了什么?

1 个答案:

答案 0 :(得分:1)

这样的事情会起作用:

<%= form_for @my_model_object do |form| %>
  <%= form.label :column_name "Some Description" %>
  <%= form.select :field_that_stores_id, options_for_select({"text1" => "key1", "text 2" => "key2"}) %>
<% end %>

<强>更新

如果您以后想要显示文本,可以从这样的简单哈希中获取它:

{"key1" => "text 1", "key2" => "text2"}[@my_object.field_that_stores_id]

但是你最好将这个哈希存储在像模型这样的中心位置。

class MyModel < ActiveRecord
  @@my_select_something_data = {"key1" => "text 1", "key2" => "text2"}
  def text_for_something_selectable
    @@my_select_something_data[field_that_stores_id]
  end
end

然后你可以在你的视图中使用它,比如

@my_object.text_for_something_selectable

这有很多可能的变化。但这应该有效,你可以将所有信息放在一个中心位置。

<强>更新

好的,我在网站上使用了类似的东西。我们需要为rma存储return_headers。那些需要将返回原因存储为代码。这些代码在外部MS SQL Server数据库中定义(网站使用该数据库交换大量数据,如订单,产品等)。在外部数据库表中存储的返回原因比我实际需要的要多得多,所以我只拿出了一些。还是要确保代码是正确的。

所以这就是他的模特:

class ReturnHeader < AciveRecord::Base
  @@return_reason_keys = {"010" => "Wrong Produc",
                          "DAM" => "Damaged",
                          "AMT" => "Wrong Amount"}

  def self.return_reason_select
    @@return_reason_keys.invert
  end

  def return_reason
    @@return_reason_keys[nav_return_reason_code]
  end
end

模型当然包含更多代码,但这是重要的部分。这里相关的是,散列中的键是字符串,而不是符号。

在视图中,我使用它:

在编辑表格中:

<%= form_for @return_header do |form| %>
  <%= form.label :nav_return_reason_code "Return Reason" %>
  <%= form.select :nav_return_reason_code, options_for_select(ReturnHeader.return_reason_select, @return_header.nav_return_reason_code) %>
<% end %>

(也许没有最优雅的方式,但有效。不知道,为什么options_for_select期望哈希是“text”=&gt;“key”,但这就是为什么,为什么上面的类级方法返回哈希反转。)

在我的索引操作中,返回原因列在其中一列中。在那里,我可以简单地通过

获得价值
@return_headers.each do |rh|
    rh.return_reason
end

如果您无法运行它,请检查该键的类型和值是否正确。也许在方法中使用logger.info添加一些调试信息,以查看那里使用的实际数据。