论坛首页 编程语言技术论坛

关于rails中对checkbox的处理的几个疑问

浏览 5728 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-01-09  
几个问题:

1. rails对同名参数的解析
经试验,当请求参数为:
?test=1&test=2&test=3
时,rails解析参数的结果为:
test=1
。即只保留了第一个同名参数,而其余的被忽略。
由于Ruby不熟,看不懂源代码,因此无法确定以上结果是否必然。

2. rails对checkbox的处理
根据RDoc对FormHelper::check_box()方法的说明,以下调用
check_box("puppy", "gooddog", {}, "yes", "no")
将得到输出结果:
      <input type="checkbox" id="puppy_gooddog" name="puppy[gooddog]" value="yes" />
      <input name="puppy[gooddog]" type="hidden" value="no" />

如果1的假设成立的话,要保证服务器端获得checkbox的正确的值,须再作假定:浏览器提交窗体时,将依据元素在窗体中出现的顺序依次提交。
不知以上推理是否正确,该假定是否对所有浏览器成立。

3. rails如何处理多项选择的checkbox
在某些系统中,通常使用一组同名checkbox来处理需要多项选择的情况,如下例所示:
<input type="checkbox" id="foo_bar" name="foo[bar]" value="1" />
<input type="checkbox" id="foo_bar" name="foo[bar]" value="2" />
<input type="checkbox" id="foo_bar" name="foo[bar]" value="3" />

在java servlet中,同名的参数,其对应参数值将被解析为一个数组。而在rails中由于1中指出的问题,只有第一个参数值被保留,其余将被舍弃。
在rails中,有其余方法可以达到类似效果吗?
   发表时间:2008-01-09  

用同名参数当然不可行了,但是使用同名数组就不一样了。

在RHTML中使用check_box_tag:

<%=check_box_tag 'puppies[]',1,false%>
<%=check_box_tag 'puppies[]',2,false%>

 

在CONTROLLER中使用:

params[:puppies].to_a.each do |puppy|
...
end

这样可以获得你选中的所有CHECK_BOX的值。

 

0 请登录后投票
   发表时间:2008-01-11  
谢谢。
写了一个helper方法,用来显示多个选项的checkbox,欢迎指正:
def check_boxes(form_name, field_name, choices, options)
    object = self.instance_variable_get("@#{form_name}")
    selected = object ? object.send("#{field_name}").to_a : []
    choices = choices.to_a if Hash === choices
    choices.inject([]) do |tags, element|
      if !element.is_a?(String) and element.respond_to?(:first) and element.respond_to?(:last)
        is_selected = ( (selected.respond_to?(:include?) && !selected.is_a?(String) ? selected.include?(element.last) : element.last == selected) )
        if is_selected
          tags << "<input type=\"checkbox\" name=\"#{form_name}[#{field_name}][]\" value=\"#{html_escape(element.last.to_s)}\" selected=\"selected\">#{html_escape(element.first.to_s)}"
        else
          tags << "<input type=\"checkbox\" name=\"#{form_name}[#{field_name}][]\" value=\"#{html_escape(element.last.to_s)}\">#{html_escape(element.first.to_s)}"
        end
      else
        is_selected = ( (selected.respond_to?(:include?) && !selected.is_a?(String) ? selected.include?(element) : element == selected) )
        tags << ((is_selected) ? "input type=\"checkbox\" name=\"#{form_name}[#{field_name}][]\" value=\"#{html_escape(element.to_s)}\" selected=\"selected\">#{html_escape(element.to_s)}" : "input type=\"checkbox\" name=\"#{form_name}[#{field_name}][]\" value=\"#{html_escape(element.to_s)}\">#{html_escape(element.to_s)}")
      end
    end
  end
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics