#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 .
У меня есть несколько проблем, которые не ясны для выполнения этой задачи:
- В моей модели администратора я использую has_many:volunteers с миграцией, которая помещает volunteer_id в качестве внешнего ключа в таблицу базы данных администратора. Достаточно ли этого для выполнения поставленной задачи или мне нужно создать таблицу соединений для :approved ? Я не могу пригласить добровольцев belong_to:administrators, потому что они не смогут зарегистрироваться самостоятельно, они должны быть созданы администраторами.
- Я не уверен точно, как настроить код для помощников флажков в моем представлении администратора. Я использую 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>
- Я не совсем уверен, как обрабатывать массив значений флажков, которые возвращаются контроллеру администратора для обновления таблицы базы данных добровольцев. Нужно ли мне создавать хэш в представлении (как это сделать?), А затем перебирать хэш для update_attribute(:approved, true) для каждого проверенного добровольца? Я создал метод update_pending_volunteers в контроллере администратора для операции POST, но мне неясен код, который должен быть там, потому что я не уверен в подходе с флажком.
Заранее спасибо за ваше терпение с новичком. Это кажется такой простой вещью, но я не уверен в правильном подходе. Я потратил довольно много времени на просмотр API, видеороликов и статей о переполнении стека, но, похоже, не могу собрать воедино информацию, которая даст мне уверенность в конкретном подходе, чтобы сделать это правильно. Опять же, это кажется такой простой задачей, но стало источником разочарования.
Комментарии:
1. Если в таблице volunteers, как вы говорите, есть значение approved , то вам не нужны какие-либо из этих отношений, просто обновите это значение и разрешите это делать только администраторам.
volunteer_id
не должно быть в таблице администратора, то есть наоборот. Если администраторhas_many
добровольно, то у добровольцев будет anadministrator_id
, который является идентификатором администратора, которого у нихbelong_to
и администраторов не будетvolunteer_id
, поскольку у них их много.2. Да, вы правы, у меня все наоборот. Я пытаюсь связать добровольцев и администраторов через модель базы данных, потому что, когда они не были связаны, я получал ошибки объекта «nil» при попытке получить доступ к таблице базы данных добровольцев при входе в систему как администратор.
Ответ №1:
- Смотрите Комментарий от Rockwell Rice. Не создавайте никаких отношений для этой функциональности.
- Используйте функцию 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. Спасибо за ваш быстрый ответ, это было очень полезно. Как упоминалось в ответе на 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
Добровольцы, переданные в представление, уже проанализированы только для тех, которые не были одобрены, поэтому идентификаторы добровольцев, возвращенные как проверенные, только из этого списка.