【问题标题】:How to set the value of radio button after submitting form?提交表单后如何设置单选按钮的值?
【发布时间】:2014-03-22 08:03:43
【问题描述】:

我正在使用 Rails 3.2。我有一个搜索表单,其下方有单选按钮。它根据选择的单选按钮进行搜索。目前我认为这是:

  = radio_button_tag(:ad_type, "free")
  = label_tag(:ad_type_free, "free")
  = radio_button_tag(:ad_type, "paid")
  = label_tag(:ad_type_paid, "paid")
  = radio_button_tag(:ad_type, "featured")
  = label_tag(:ad_type_featured, "featured")

所以我的问题是,如何设置要选择的默认单选按钮?我试过使用radio_button_tag(:ad_type, "free", :checked => true),但是在提交表单后,它总是选择那个单选按钮。我想要的是根据先前的请求选择值。我应该从 url 参数中获取值吗?如果是这样,我如何设置初始默认值(当没有以前的搜索时)?非常感谢。

更新

我创建了一个辅助方法 ad_type_selected?

  def ad_type_selected?(ad_type)
    selected_ad_type = params[:ad_type] || "free"
    (selected_ad_type == ad_type) ? true : false
  end

我认为这是:

  = radio_button_tag(:ad_type, "free", :checked => ad_type_selected?("free"))

但是,单选按钮仍未被选中。检查日志,我看到对助手的第一次调用返回 true,其他返回 false,这正是我想要的。但问题是它仍然没有选择单选按钮。如果我检查输入标签,我只能看到checked属性设置为“checked”。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    我正在挖掘坟墓,但我只是遇到了这个。

    <label class='checkbox-inline'>
      <%= radio_button_tag :option, :user, true %>
      Username
    </label>
    <label class='checkbox-inline'>
      <%= radio_button_tag :option, :email, params[:option] == 'email' ? true : false %>
      Email
    </label>
    <label class='checkbox-inline'>
      <%= radio_button_tag :option, :name, params[:option] == 'name' ? true : false %>
      Full Name
    </label>
    

    所以...这将默认设置第一个按钮(并且总是),但如果选择了其他参数,它们将变为 true。单选按钮将始终为您选择最后一个 true 按钮,因此只要您将默认选项放在列表的首位,设置为 true,其余设置为:

    params[:name_of_your_buttons] == 'button_value' ? true : false
    

    【讨论】:

    • params[:option] == 'name' ? true : false 等价于params[:option] == 'name'
    【解决方案2】:

    显然,为所有单选按钮添加选中属性会导致始终选中最后一个单选按钮。所以我所做的只是添加一个选中的属性,如果参数匹配单选按钮。

    所以对于我的示例,我只是使用了一个助手来生成适当的单选按钮,如下所示:

      def ad_type_radio_button(ad_type)
        selected_ad_type = params[:ad_type] || "free"
    
        if selected_ad_type == ad_type
          radio_button_tag(:ad_type, ad_type, :checked => true)
        else
          radio_button_tag(:ad_type, ad_type)
        end
      end
    

    在我看来是这样的:

    = ad_type_radio_button("free")
    

    我知道它远非优雅,但它现在表现正确。

    【讨论】:

      【解决方案3】:

      如果 params[:ad_type] 为 nil,此 sn-p 将设置为 false。否则,如果 params[:ad_type] 设置为 true,它将设置为 true。

      radio_button_tag(:ad_type, "free", :checked => (params[:ad_type] == nil ? false : params[:ad_type]))
      

      以防万一您没有看到上面使用的 if / then / else 的简写,它是:

      test-expression ? if_true_expression : if_false_expression
      

      【讨论】:

      • 但是 params[:ad_type] 包含一个字符串,那我应该使用 params[:ad_type] == "free" 吗?真假 ?并为所有单选按钮重复此操作?
      • 这对我来说看起来是正确的......玩它,看看它是怎么回事。
      • 或者您可以执行类似 params[:ad_type].present 的操作?如果它与 null 或 false 不同,则返回 true
      • 即使我添加了选中的属性,单选按钮仍然没有被选中。我已经更新了问题,谢谢。
      【解决方案4】:

      根据docschecked 不是选项哈希参数,它只是一个布尔值。

      这不起作用(至少在 rails 4 中):

      = radio_button_tag(:ad_type, "free", :checked => ad_type_selected?("free"))
      

      应该是:

      = radio_button_tag(:ad_type, "free", ad_type_selected?("free"))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-12
        相关资源
        最近更新 更多