Ruby 如何取复选框 check_box_tag 的值

kun · 2022年03月25日 · 最后由 kun 回复于 2022年03月28日 · 312 次阅读

我想从复选框中拿到 tiku.id,并在 Controller 中被选中的 id 进行操作,但是遇到了错误 我应该怎么从 check_box_tag 中正确的取出 id?如果是多个复选框,属于数组吗?我应该用循环操作吗? View 代码

<% Tiku.all.each do |tiku| %>
    <tr>
        <td><%= label_tag("integrity_checkbox[#{tiku.id}]") do %>
            <%= check_box_tag("integrity_checkbox[#{tiku.id}]", tiku.id, false) %>
            <%= content_tag("span", "#{tiku.timu}") %>
    </tr>
<% end %>

这会显示多个复选框,当我选择多个的时候提交的信息是 "integrity_checkbox"=>{"4"=>"4", "5"=>"5"},

Controller 中的代码

tiku = Tiku.find(params[:integrity_checkbox])

显示错误:Couldn't find Tiku with 'id'={"4"=>"4", "5"=>"5"}

这样就可以了:

<% Tiku.all.each do |tiku| %>
    <tr>
        <td><%= label_tag("integrity_checkbox[#{tiku.id}]") do %>
            <%= check_box_tag("integrity_checkbox[]", tiku.id, false) %>
            <%= content_tag("span", "#{tiku.timu}") %>
        <% end %>
       </td>
    </tr>
<% end %>
qichunren 回复

按您说的 这导致我复选框无法选取了,因为复选框在循环里面,这是不是导致了所有的 integrity_checkbox[] 名字相同,但是认为是一个了?

kun 回复

哦,不是无法选了,只是 lable id 没有对应上,再改一下,这样:

<% Tiku.all.each do |tiku| %>
    <tr>
        <td><%= label_tag("integrity_checkbox[#{tiku.id}]") do %>
            <%= check_box_tag("integrity_checkbox[]", tiku.id, false, id: "integrity_checkbox_#{tiku.id}") %>
            <%= content_tag("span", "#{tiku.timu}") %>
        <% end %>
       </td>
    </tr>
<% end %>
qichunren 回复

确实去到了 check_box_tag 中我想要的值,但是我又遇到了新的问题

tiku = Tiku.new
tiku = Tiku.find(params[:integrity_checkbox])
flash[:success]="#{tiku.timu}"

当我取 tiku.timu 的时候告诉我 undefined method timu' for #<Array:0x00007fa4d068cd20> 甚至包括 flash[:success]="#{tiku.id}"也会显示undefined methodid' 导致这个问题可能的原因是什么呢?我现在确定 tiku = Tiku.find(params[:integrity_checkbox]) 已经拿到了我想要的值,并可以显示出来 我当前的操作不是在 tikus_controller.rb 里面,而是在另外一个控制器,并且他们没有关联,是这个原因吗?我应该怎么解决呢?

kun 回复

因为 tiku = Tiku.find(params[:integrity_checkbox]) 的结果是一个数组,而你想要的表记录的属性timu是对应到数组中的元素上。

kun 回复

tiku = Tiku.find(params[:integrity_checkbox])

这里有两种正常情况 (假设 params[:integrity_checkbox] 里的 id 都在 tiku 表中)

  • params[:integrity_checkbox] 里的 id 只有一个,例如 [1], 此时 tiku 是 Tiku 的一个实例 (代表 tiku 表中 id 为 1 的数据)

  • params[:integrity_checkbox] 里的 id 有若干个,例如 [1, 2], 此时 tiku 是 Tiku 的两个实例组合成的数组 (代表 tiku 表中 id 为 1 和 2 的两条数据),所以没有 timu 方法

另外可以建议先看错误显示

如果你的项目中有 byebug 之类的 gem 的话,可以在报错位置之前插入 byebug 调试,程序运行到 byebug 的位置时会暂停,你就可以打印出 timu 的内容等等,如果没有的话,也可以打印到控制台看相关内容

illusove 回复

你说的不对哦,对于 find 方法,如果传入一个 id 数组参数,不管怎么样返回的结果都是一个数组或者 ActiveRecord::RecordNotFound

qichunren 回复

哦,对的,我还没注意到这个细节😂 ,一直用 find 只查一个 id,理所当然的套用了以前的经验

很感谢你们的解答。我的问题已经解决了,第一次用 check_box_tag 和 find 传入数组,找了好多教程也没介绍的特别详细,现在我已经理解其中的原理啊

kun 关闭了讨论。 03月28日 09:45
需要 登录 后方可回复, 如果你还没有账号请 注册新账号