Добавление переключателей в новую регистрационную форму Devise - PullRequest
0 голосов
/ 27 февраля 2019

Приложение My Ruby on Rails использует Devise для аутентификации пользователей.Хотя у меня не было проблем с добавлением полей в форму регистрации по умолчанию, я новичок, и мне не повезло с переключателями.

Каждый :user - это :teacher или :student (user Таблица является самосоединением, фактически на этой основе).Таким образом, текущая рабочая регистрация требует, чтобы лицо, подписывающееся, печатало «студент» или «учитель» в текстовом поле «Должность».Естественно, это не удобно для пользователя, даже если оно функционально, поэтому я хотел бы заменить это текстовое поле двумя переключателями.

Что я пробовал:

В модели users.rbЯ добавил константу:

POSITIONS = [ 
  ["student", "Student"], 
  ["teacher", "Teacher] 
]

На devise/registrations/new.html.erb Я изменил код поля на:

    <div class="radio">
      <%= f.label :position, 'Position', :class => 'position-button' %><br />
      <div class="input-form">
        <%= f.collection_radio_buttons(:position, @positions_collection, :first, :last) %>
      </div>
    </div> 

И затем я перешел к контроллеру.Насколько мне известно, если бы Devise не был частью моего приложения, я бы вызвал константу POSITIONS в users_controller.rb таким образом:

def new
  @user = User.new
  @positions_collection = User::POSITIONS
end

Однако автоматически сгенерированный users_controller.rb с Devise начинается сничего в def new, но вместо этого, кажется, полагается на пользовательские методы в нижней части файла для обработки новых пользователей:

  def resource_name
    :user
  end

  def resource
    @resource ||= User.new
  end

  def resource_class
    User
  end

  def devise_mapping
    @devise_mapping ||= Devise.mappings[:user]
  end

Поэтому я начал экспериментировать, начав с простого добавления @positions_collection = User::POSITIONS к def new,Перезагрузка страницы регистрации вернула следующую ошибку: «NoMethodError в Devise :: Registrations # new [snip], где поднялась строка # 30: неопределенный метод 'map' для nil: NilClass".Эта ошибка возникает снова и снова, независимо от того, где я пытался вставить @positions_collection = User::POSITIONS в контроллере, даже в пользовательских методах и даже пробовать его в сочетании с @user = User.new.

(строка 30 относится кна <%= f.collection_radio_buttons(:position, @positions_collection, :first, :last) %> в файле просмотра, который предполагает, что @positions_collection является камнем преткновения, я бы поставил.)

У кого-нибудь есть мысли о том, как действовать?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Ваша проблема с классом nil заключается в том, что он не определен в методе "create":

@positions_collection = User::POSITIONS

Самое простое решение - удалить эту переменную и использовать User::POSITIONS непосредственно в представлении..

<% User::POSITIONS.map...

0 голосов
/ 27 февраля 2019

Как я понимаю, вы используете строковый столбец для хранения типа пользователя.Лучшим вариантом будет использование целочисленного столбца position и перечисления для представления роли пользователя:

class User < ApplicationRecord
  enum position: [:student, :user]

  ...

end

Тогда в вашей форме вы можете отобразить значения из перечисления:

<%= f.select(:position, User.positions.keys.map {|position| [position.titleize,position]}) %>

Это будетбудет более четкое решение.

...