Rails Bootstrap_form - 单选按钮不在显示页面中呈现标签名称

时间:2015-06-24 18:50:45

标签: ruby-on-rails forms radio-button bootstrap-form-helper

我有一个使用bootstrap_form gem构建的表单,用于ruby。在表格中我有一些单选按钮。表单在表单的编辑页面中使用正确的标签完美呈现,但是一旦我保存表单并转到“显示”页面查看结果,单选按钮的输入仅显示单选按钮的值(这是数字)而不是我指定的自定义标签名称。如何显示自定义标签而不是显示页面中的值?

这是我的代码:

_form.html.erb:

  <%= f.form_group :gender, label: { text: "Gender" } do %>
    <%= f.radio_button :gender, 0, label: "Female", checked: true, inline: true  %>
    <%= f.radio_button :gender, 1, label: "Male", inline: true  %>
  <% end %>

  <%= f.form_group :nationality, label: { text: "Nationality" } do %>
    <%= f.radio_button :nationality, 0, label: "Kuwaiti", checked: true, inline: true  %>
    <%= f.radio_button :nationality, 1, label: "Non-Kuwaiti", inline: true  %>
  <% end %>

show.html.erb

    <p><strong>Full Name:</strong>&nbsp;&nbsp;<%= @profile.name %></p>
    <p><strong>Civil ID no:</strong>&nbsp;&nbsp;<%= @profile.civil %></p>
    <p><strong>Gender:</strong>&nbsp;&nbsp;<%= @profile.gender %></p>
    <p><strong>Nationality:</strong>&nbsp;&nbsp;<%= @profile.nationality %></p>
    <p><strong>Mobile no:</strong>&nbsp;&nbsp;<%= @profile.mobile %></p>
    <p><strong>Personal Email:</strong>&nbsp;&nbsp;<%= @profile.personal_email %></p>

提前感谢您的帮助!

更新: -

新表单代码: -

<%= f.form_group :gender, label: { text: "Gender" } do %>
    <%= f.radio_button :gender, 1  %>
    <%= f.label 'Female', inline: true, checked: true  %>
    <%= f.radio_button :gender, 0  %>
    <%= f.label 'Male', inline: true  %>
  <% end %>

尝试了这个建议,但仍然遇到同样的问题,只有单选按钮不再符合标准并且格式不正确。

4 个答案:

答案 0 :(得分:1)

您需要一个查找表

您已保存与单选按钮对应的数值。因此,当您在show.htm.erb中显示变量时,它将显示从数据库记录中检索的数值。这是有道理的。但是你需要与数字相关联的字符串,这需要一个查找表

在表单中创建标签不会为您的字段创建自定义标签。要创建自定义字段标签,您需要为activerecord模型设置i18n本地化,这是一个很好的解决方案,但也一个需要一些时间和学习曲线的人。

创建基于哈希的查找表。

Active Hash gem

您可以编写自己的查找帮助程序或使用此gem,这简化了实现基于散列的查找表。

示例

# in app/models/person.rb
class Gender < ActiveHash::Base
  self.data = [
    {:id => 0, :gender => "Female"},
    {:id => 1, :gender => "Male"}
  ]
end

从他们的规范

  

我们编写了ActiveHash,以便我们可以使用简单的,内存中,类似ActiveRecord的数据结构,这些数据结构可以很好地与Rails表单...

在gem(更新)中构建错误

我刚检查了一下它的构建似乎有错误。可能现在最好避免。

使用视图助手将布尔值转换为字符串(已添加)

你可以实现你的/helpers/profile_helper.rb的助手。我把它们称为“查找”,但这可能不是标准的。

对于每个布尔值,您需要转换为字符串创建一个帮助

#profile_helper.rb  
# Each of your booleans
def gender_to_s(value)
    value ? "Male" : "Female"
end

def nationality_to_s(value)
    value ? "Kuwaiti" : "Non-Kuwaiti"
end


# Generic true/false conversion
def boolean_to_s(value)
    value ? "Yes" : "No"
end

注意:我会一致地命名帮助程序以匹配字段名称,因此在您的视图中,调用哪个“to_s”非常明显。

在您的视图中

<p><strong>Gender:</strong>&nbsp;&nbsp;<%= gender_to_s(@profile.gender)  %></p>

注意:如果你想要一个单一的视图助手,这可以在application_helper.rb中实现,并包含一个传递参数“type”作为开关控件,但我认为最直接的解决方案是为每个字段创建一个视图助手

答案 1 :(得分:0)

您需要标签的单独标签。而不是:

<%= f.radio_button :gender, 1, label: "Male", inline: true  %>

你需要:

<%= f.radio_button :gender, 1  %>
<%= f.label 'Male, inline: true  %>

也可能值得看看这个答案:Bootstrap 3: does form-horizontal work for radio buttons with a control-label?

它不使用表单标签助手,但看起来它可以满足你的需要。

答案 2 :(得分:0)

确定另一种方法,以便您有一整套可供选择。在Rails 4.1中,枚举数据类型在ActiveRecord中实现,如release notes的第2.5节所述。如果您运行的是Rails 4.1+,则可以利用此新功能。

基本上,您需要编写迁移来将布尔值和其他数据类型更改为枚举。例如,对于性别示例,不是将0表示女性,1表示男性,而是为此保留映射,您可以简单地:

enum gender: [:female, :male]

同样适用于您的其他属性。

这最终应该更容易维护,并有助于使您的应用程序代码尽可能透明。

答案 3 :(得分:0)

 <label><%= form.radio_button :gender, 1, hide_label: true, inline: true%>Female</label>
 <label><%= form.radio_button :gender, 0, hide_label: true, inline: true%>Male</label>

为我工作的Bootstrap 4.1