用于两个布尔数据库属性的Rails单选按钮

时间:2012-10-18 18:58:01

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

我的Attendance模型有两个Boolean数据库属性(:late:absent),并且都有:default => false

我正在尝试制作一个只有2个单选按钮的表单。一个是迟到的,一个是缺席的。当然,用户只能选择其中一个。

我尝试了很多变化但却无法正常工作。

任何人都可以帮我一把吗?我知道我可以很容易地选择收藏,但单选按钮将有助于用户体验。此外,由于一系列原因,我需要继续使用db模式......

万分感谢!!!

3 个答案:

答案 0 :(得分:5)

我不知道任何支持开箱即用所需功能的rails助手。我还质疑可用性,因为如果模型既不迟到也不存在但是偶然被点击,用户将无法取消选择单选按钮。

除此之外,我使用radio_button_tag并提供两个选项,然后在您的控制器中相应地更新params。这是一个基本的例子:

<%= form_tag('/your/path') do %>
  <%= radio_button_tag :status, 'late' %>
  <%= label_tag :status_late, 'Late' %>
  <%= radio_button_tag :status, 'absent' %>
  <%= label_tag :status_absent, 'Absent' %>
  <%= submit_tag :submit %>
<% end %>

当然,您将拥有所需的任何其他字段,然后在您的控制器中输入以下内容:

def create
  case params[:status]
  when 'late'
    params[:model_name][:late] = true
  when 'absent'
    params[:model_name][:absent] = true
  end

  ModelName.new(params[:model_name])
end

这些方面的东西应该可以解决问题。

答案 1 :(得分:1)

@options = ["Late", "Absent"]
@selected_options = ""

<% @options.each do |option| %>
    <%=  radio_button_tag 'attendance_radio', option, option == @selected_option %> <%= label_tag 'name', option %> <br />
<% end %>

将选定的电台存储在attendance_radio

如果您希望表单中的值不是实际选择的值(迟到,不存在),那么您可以使用第二个参数来保留boolean而不是

答案 2 :(得分:0)

在上面的第一个答案中,编辑这样的参数并不是最好的做法。我会通过为布尔值创建隐藏字段并根据使用Javascript选择哪个单选按钮来相应地设置它们来处理这个问题。

我没有足够的声誉来评论,因此创建了一个新答案。

(if $('#id_of_radio_button').is(:checked)) {
  $('#id_of_hidden_tag:hidden').val(true);
}

然后你可以像往常一样将它传递给你的控制器中没有额外重量的参数。