Rails 3.1 - Попытка заставить check_box_tag работать с таблицей поиска - PullRequest
1 голос
/ 21 декабря 2011

Я новичок в Rails и мне было весело, пока я не борюсь с check_box_tag. Я прочитал много вопросов на этом сайте и до сих пор не решил свою проблему. Я убежден, что это то, чего мне просто не хватает.

У меня есть таблица reportdetail и таблица buginfo. Таблица buginfo представляет собой таблицу ошибок, доступную только для чтения, которую я хочу найти в какой-либо программе. Таблица reportdetail будет содержать отчеты, которые будут содержать список ошибок (из таблицы buginfo), которые пользователь хочет найти. Я могу иметь много отчетов в таблице подробностей отчета.

class Reportdetail < ActiveRecord::Base
  has_many :buginfos
end

class Buginfo < ActiveRecord::Base
  belongs_to :reportdetail
end

Вот моя схема. Это просто:

ActiveRecord::Schema.define(:version => 20111221162309) do

  create_table "buginfos", :force => true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "reportdetails", :force => true do |t|
    t.string   "name"
    t.integer  "buginfo_id"
    t.boolean  "bug_detected"
    t.datetime "created_at"
    t.datetime "updated_at"
  end
end

И, наконец, мой частичный _form.html.erb для reportdetail:

<%= form_for(@reportdetail) do |f| %>
  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <table>  
      <% Buginfo.find(:all).each do |buginfo| %>
        <tr>
          <td> <%= check_box_tag("[buginfo_id][]",1,buginfo.id) %> </td>
          <td> <%= buginfo.name %> </td>
        </tr>
      <% end %>
    </table>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

Форма правильно показывает флажок рядом с каждой ошибкой, и я могу даже установить флажки, однако данные никогда не сохраняются. Я знаю, что первый параметр для check_box_tag должен быть уникальным, и я уверен, что это правильно. Я знаю, что вторым параметром является значение флажка, но что это на самом деле означает? Я предполагаю, что это означает текущее значение того, была ли выбрана эта ошибка или нет, но так как я еще ничего не выбрал, я не уверен, что делать. В соответствии с документами, которые я прочитал, третий параметр должен быть «флажок установлен или нет?» Но еще раз, к чему это относится? - текущее значение или ...

Если пользователь создает новый reportdetail и предполагает, что в базе данных buginfos есть 5 ошибок, я бы предположил 5 флажков, которые будут отображаться в / reportdetail / new. Это происходит правильно. Если бы я выбрал 3 ошибки для детализации отчета (установив флажки), я бы предположил, что в базе данных будет создано три записи для представления каждой ошибки, которую хочет включить в отчет. Этого не происходит вообще. Я просто получаю одну запись, а buginfo_id и bug_detected равны нулю.

Любое руководство будет с благодарностью. Спасибо за любую помощь, вы можете дать мне.

Ответы [ 2 ]

1 голос
/ 22 декабря 2011

Ваше основное действие form_for / standard действительно только хочет создать один объект за раз.

Что касается параметров тега check_box,

  • первым является имя ввода. Это в основном решает, где в хэше params будет стоять этот флажок (если он установлен)
  • вторым является значение: если флажок установлен, что следует поместить в хэш params (если флажок не установлен в точке отправки формы, в хэш params ничего не ставится)
  • третий - должен ли флажок изначально показываться как отмеченный.

То, что я хотел бы сделать здесь, это поставить

<%= check_box_tag 'buginfo_ids[]', buginfo.id %>

В представлении, перебирая информацию об ошибке как вы. [] В конце входного имени означает, что rails будет собирать все отправленные значения (т. Е. Идентификатор buginfo) для каждого флажка в массив, поэтому params [: buginfo_ids] будет либо nil (без выбранных ошибок), либо массив идентификаторов

Затем в вашем контроллере выполните итерацию по этому массиву и создайте подробный отчет для каждого из этих идентификаторов buginfo. Мне не понятно, почему вы создаете несколько деталей отчета с одной информацией об ошибке каждый. Если вы хотите иметь одну деталь отчета, которая была бы habtm buginfos, вы можете пропустить бит итерации в вашем контроллере и изменить имя ввода на reportdetail [buginfo_ids] [], и rails должен автоматически создать строки в таблице соединений.

Ваша схема также, кажется, немного добавляет шансов к вашей декларации ассоциации - если reportdetail has_many buginfos, тогда ей не нужен buginfo_id. Такое ощущение, что ты действительно хочешь иметь хабтм или иметь много через ассоциацию.

0 голосов
/ 21 декабря 2011

В поле зрения

<% Buginfo.find(:all).each do |buginfo| %>
<div>
  <%= check_box_tag 'buginfo_ids[]', buginfo.id -%>

  <%= buginfo.name %>
</div>
<% end %>

запомните это в reportdetails_controller.rb

def update
  params[:buginfo_ids] ||= []
  #...
end

Если вы новичок в рельсах, посмотрите Railscasts. Райан Бейтс на протяжении многих лет сделал его обширной библиотекой. Ищите «check_box» _tag, и вы получите 10 минут об этом. # 17 Флажки HABTM

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...