Ruby on Rails пытается обновить логическое значение в таблице пользователя при входе в систему как другая сущность

#ruby-on-rails

#ruby-on-rails

Вопрос:

Я очень новичок в Ruby и Ruby on Rails. Я пытаюсь обновить веб-приложение, в котором зарегистрировались добровольцы, которым требуется одобрение, прежде чем они смогут получить доступ к полной функциональности веб-сайта. Я добавил логическое поле в модель базы данных добровольцев с именем :approved, значение которого по умолчанию равно false при регистрации добровольца, и требует, чтобы зарегистрированный администратор обновил его до true. Я создал класс администратора в своем проекте, который может просматривать список ожидающих добровольцев из контроллера:

 def view_pending_volunteers
    @navbar = true
    @volunteers = Volunteer.where(approved: false)
end
 

В представлении администратора я хочу использовать флажки, связанные с volunteer , которые при отправке позволят администратору обновить поле :утверждено в таблице volunteer .

У меня есть несколько проблем, которые не ясны для выполнения этой задачи:

  1. В моей модели администратора я использую has_many:volunteers с миграцией, которая помещает volunteer_id в качестве внешнего ключа в таблицу базы данных администратора. Достаточно ли этого для выполнения поставленной задачи или мне нужно создать таблицу соединений для :approved ? Я не могу пригласить добровольцев belong_to:administrators, потому что они не смогут зарегистрироваться самостоятельно, они должны быть созданы администраторами.
  2. Я не уверен точно, как настроить код для помощников флажков в моем представлении администратора. Я использую form_with, но я уверен, что мой код неверен. Я хотел бы передать массив параметров для каждого флажка_box, связанного с полем :утверждено для списка ожидающих добровольцев, обратно в контроллер.
 <p><b style="color:blue;font-size:24px;">
<%= form_with(model: @volunteer, local: true) do |f| %>
   <% @volunteers.each do |v| %>
   <li>
     Volunteer: <%= x.first_name%> <%= x.last_name%> amp;emsp;Age: <%= x.age%> amp;emsp;Description: <%= x.description%>amp;emsp;
     <%= f.check_box (@volunteers, v.approved, options = {}, checked_value = "1", unchecked_value = "0")%>
                         
    </li>
    <% end %>
 <%= f.submit "Approve" %>
<% end %>
</b></p>
 
  1. Я не совсем уверен, как обрабатывать массив значений флажков, которые возвращаются контроллеру администратора для обновления таблицы базы данных добровольцев. Нужно ли мне создавать хэш в представлении (как это сделать?), А затем перебирать хэш для update_attribute(:approved, true) для каждого проверенного добровольца? Я создал метод update_pending_volunteers в контроллере администратора для операции POST, но мне неясен код, который должен быть там, потому что я не уверен в подходе с флажком.

Заранее спасибо за ваше терпение с новичком. Это кажется такой простой вещью, но я не уверен в правильном подходе. Я потратил довольно много времени на просмотр API, видеороликов и статей о переполнении стека, но, похоже, не могу собрать воедино информацию, которая даст мне уверенность в конкретном подходе, чтобы сделать это правильно. Опять же, это кажется такой простой задачей, но стало источником разочарования.

Комментарии:

1. Если в таблице volunteers, как вы говорите, есть значение approved , то вам не нужны какие-либо из этих отношений, просто обновите это значение и разрешите это делать только администраторам. volunteer_id не должно быть в таблице администратора, то есть наоборот. Если администратор has_many добровольно, то у добровольцев будет an administrator_id , который является идентификатором администратора, которого у них belong_to и администраторов не будет volunteer_id , поскольку у них их много.

2. Да, вы правы, у меня все наоборот. Я пытаюсь связать добровольцев и администраторов через модель базы данных, потому что, когда они не были связаны, я получал ошибки объекта «nil» при попытке получить доступ к таблице базы данных добровольцев при входе в систему как администратор.

Ответ №1:

  1. Смотрите Комментарий от Rockwell Rice. Не создавайте никаких отношений для этой функциональности.
  2. Используйте функцию URL form_with, а не model . Вы действуете не на одного добровольца, вы действуете на многих. Создайте маршрут post (т.е. approve_volunteers ). В представлении вы должны создать флажки следующим образом:
 <%= form_with(url: approve_volunteers_path, local: true) do |f| %>
   <% @volunteers.each do |v| %>
     <div class="field">
      <label class="checkbox">
        Volunteer: <%= x.first_name%> <%= x.last_name%> amp;emsp;Age: <%= x.age%> amp;emsp;Description: <%= x.description%>amp;emsp;
        <input type="checkbox" name="volunteers[]" value="<%= v.id %>"> 
      </label>
    </div>
  <% end %>
  <%= f.submit "Approve" %>
<% end %>
 

Это должно отправлять параметры через форму like {"volunteers" => ["1", "3"]} и оставлять остальное пустым. Возможно, вам придется немного поиграть с ними. Проверьте параметры в своей консоли.

Затем в вашем контроллере что-то вроде:

 def approve_volunteers
  volunteer_ids = []
  volunteers = Volunteer.where(approved: false)
  volunteers.each do |v|
    if v.id.in?(params[:volunteers])
      volunteer_ids << v.id
    end
  end
  Volunteer.where('id IN (?)', volunteer_ids).update(approved: true)
end
 
  1. Смотрите выше.

Комментарии:

1. Спасибо за ваш быстрый ответ, это было очень полезно. Как упоминалось в ответе на Rockwell, казалось, что мне нужна какая-то связь между администраторами и добровольцами. потому что я получал ошибку «ноль» при попытке получить доступ к таблице базы данных добровольцев при входе в систему как администратор. Ваше предложение формы отлично работает и возвращает «Параметры: {«authenticity_token»=>»…», «добровольцы»=>[«3″], » commit»=>»Утвердить»}» Код контроллера необходимо изменить, так как я получаю null в volunter_ids: Volunteer Load (1.2мс) ВЫБЕРИТЕ «добровольцы».* ИЗ «добровольцев», ГДЕ (идентификатор В (NULL))

2. Возможно, мне потребуется добавить, что модель добровольцев была создана с помощью Devise. Возможно, в модели разработки есть что-то, что мешает администратору обновлять поле в таблице базы данных добровольцев.

Ответ №2:

Код флажка, предоставленный Sam, работал отлично. Мой URL-адрес для представления — «update_pending_volunteers_path». Мне нужно немного улучшить форматирование.

Код в контроллере, который работал для перебора массива идентификаторов добровольцев, который был передан обратно в контроллер, выглядит следующим образом:

   def view_pending_volunteers
    @navbar = true
    @volunteers = Volunteer.where(approved: false)
  end

  def update_pending_volunteers
    @navbar = true
    params[:volunteers].each do |value|
      Volunteer.find(Integer(value)).update(approved: true)
    end
    redirect_to (administrator_dashboard_path)
  end
 

Добровольцы, переданные в представление, уже проанализированы только для тех, которые не были одобрены, поэтому идентификаторы добровольцев, возвращенные как проверенные, только из этого списка.