【问题标题】:Rails Bootstrap_form - Radio buttons not rendering label name in the show pageRails Bootstrap_form - 单选按钮未在显示页面中呈现标签名称
【发布时间】:2015-09-11 03:10:51
【问题描述】:

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

这是我的代码:

_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 %>

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

【问题讨论】:

  • 你运行的是什么版本的 Rails?

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


【解决方案1】:

你需要一个查找表

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

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

创建一个基于哈希的查找表。

活动哈希宝石

您可以编写自己的查找助手或使用此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”作为开关控件,但我认为最直接的解决方案是为每个字段创建一个视图助手.

【讨论】:

  • 感谢您的回复。我尝试添加活动的 Hash gem 并按照提供的步骤操作,但它似乎没有做任何事情。我不确定我做错了什么。你能指导我完成它的实施过程吗?我是 Rails 的新手(和一般的编程),所以很多这对我来说都是全新的。无论如何感谢您的帮助!
  • 如果 gem 不能开箱即用,那么我建议创建自己的查找助手。如果你想在你的字符串上使用 i18n 国际化,这也可能在未来变得更容易。我将使用此信息更新答案中的最后一部分。
  • 似乎 gem 构建失败。我希望我添加的视图助手部分可以解决您的问题。告诉我。
  • 抱歉,回复晚了。我刚刚实施了您使用助手的建议,它似乎有效,但有一个小问题:无论我选择什么输入,显示页面上的单选按钮的结果似乎都停留在一个选项上。例如,如果我以我仍然得到“男性”的形式选择“女性”。你知道可能是什么问题吗?
  • 没关系,我刚刚发现了问题,我将数据类型设置为整数而不是布尔值。您的解决方案完美运行,非常感谢您的帮助!
【解决方案2】:

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

<%= 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?

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

【讨论】:

  • 感谢您的回复。我尝试了您建议的代码,但它似乎不起作用。如果您不介意检查它,我会根据您的建议使用新代码更新我的问题。谢谢!
【解决方案3】:

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

基本上,您需要编写迁移以将布尔值和其他数据类型更改为枚举。例如,对于性别示例,与其将性别 0 表示女性而 1 表示男性,并为此维护一个映射,您可以简单地拥有:

enum gender: [:female, :male]

对于你的其他属性也是如此。

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

【讨论】:

  • 您好,我已尝试实施您建议的方法,但无法正常工作。我收到一个错误:ProfilesController#update '1' 中的 ArgumentError 不是有效的性别。每当我尝试更新表单时都会出现错误。我做错了什么?
  • 您运行的是 Rails 4.1+ 吗?您能否使用架构、模型和控制器代码中的相关 sn-ps 更新您的 OP(或开始一个新问题并在此处回复链接)。
【解决方案4】:
 <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

【讨论】:

    猜你喜欢
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 2016-06-21
    • 1970-01-01
    相关资源
    最近更新 更多