【问题标题】:Simple gender radio buttons in Rails (including labels and i18n)Rails 中的简单性别单选按钮(包括标签和 i18n)
【发布时间】:2013-01-08 03:03:00
【问题描述】:

我目前正在开发一个 Rails 应用程序。在应用程序中应该可以编辑用户的性别。

我想通过一个单选框来实现这一点(经常这样做)。这是我想出的:

form_for @user do |f|
  - [:female, :male].each do |gender|
    = f.label :gender, t(:"helpers.label.member.gender_#{gender}"), value: gender
    = f.radio_button :gender, gender, checked: @user.gender == gender

我想从视图中删除尽可能多的逻辑,并尝试使用视图助手构建相同的逻辑,但失败了。

怎样才能指定一个辅助方法,让一个简单的

f.gender_select

f.gender_select @member

只显示正确的单选框?

另外,我如何以某种方式为各个选择选项指定标签,Rails i18n 会利用它(例如,f.label :first_name 将自动被翻译)

【问题讨论】:

    标签: ruby-on-rails ruby internationalization radio-button


    【解决方案1】:
    form_for @user do |form|
      - gender_radio_buttons(form)
    

    application_helper.rb

    module ApplicationHelper
    
      def gender_radio_buttons(form)
        [ :female, :male ].map do |gender|
          form.label(:gender, t(:"helpers.label.member.gender_#{gender}"), value: gender) +
          form.radio_button(:gender, gender, checked: @user.gender == gender)
        end.join("\n")
      end
    

    【讨论】:

    • 看起来不错,但是这种方法存在一些问题:不那么容易测试(我不想模拟 Form 对象) 2. 不像我想象的那样(gender_radio_buttons(form ) 而不是 form.gender_radio_buttons)
    • 调用 gender_radio_buttons(form) 是助手的工作方式。要调用 form.gender_radio_buttons,那么gender_radio_buttons 必须在表单对象的类中。我已经考虑过一种替代 Rails 工作方式的设计替代方法,即使用 View 类,而不是 helpers 模块中的方法,您实际上会在视图类中定义方法。 (也许与使用控制器对象实例变量相比,将数据从控制器传递到视图的方式不同。)
    • 这个答案是关于如何使用助手来完成的。你没有得到帮助者需要如何工作。另一种方法是使用局部视图。您仍然必须以本地方式传递表单对象。它可能会解决测试问题,因为如果您不测试您的视图,您不会介意跳过它进行测试,如果您测试视图,您可能能够调整您的方法来测试部分视图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2015-08-17
    • 2015-08-14
    • 1970-01-01
    • 2016-05-21
    • 2011-03-31
    相关资源
    最近更新 更多