Rails добавляет новый вид для разработки

Я создал представления с помощью этой команды после того, как установил устройство.

rails generate devise:views

и я переопределяю контроллер регистрации

class RegistrationsController < Devise::RegistrationsController

  def sign_up2

  end
end

И обновил route.rb с

  devise_for :users, :controllers => { :registrations => "registrations" }  

Я ожидал увидеть новый маршрут/вид на

  /users/sign_up2

но я его не вижу А здесь маршруты для разработки

        new_user_session GET    /users/sign_in(.:format)       devise/sessions#new
            user_session POST   /users/sign_in(.:format)       devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)      devise/sessions#destroy
           user_password POST   /users/password(.:format)      devise/passwords#create
       new_user_password GET    /users/password/new(.:format)  devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format) devise/passwords#edit
                         PATCH  /users/password(.:format)      devise/passwords#update
                         PUT    /users/password(.:format)      devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)        registrations#cancel
       user_registration POST   /users(.:format)               registrations#create
   new_user_registration GET    /users/sign_up(.:format)       registrations#new
  edit_user_registration GET    /users/edit(.:format)          registrations#edit
                         PATCH  /users(.:format)               registrations#update
                         PUT    /users(.:format)               registrations#update
                         DELETE /users(.:format)               registrations#destroy

Но хотелось бы новый вид и маршрут

Обновление: проблема при загрузке представления

First argument in form cannot contain nil or be empty

в этой строке

<%= form_for(resource, :as => resource_name,:html => { :class => "form-horizontal col-sm-12",:role=>"form"}, :url => user_registration_path(resource_name)) do |f| %>

person wwli    schedule 15.12.2013    source источник
comment
Какой вид и маршрут вы хотите добавить?   -  person zeantsoi    schedule 16.12.2013
comment
Понял. Посмотрите на мой ответ.   -  person zeantsoi    schedule 16.12.2013


Ответы (1)


Вызовите блок devise_scope и объявите свой собственный маршрут внутри:

devise_for :users, :controllers => { :registrations => "registrations" }  
devise_scope :user do
  get "users/sign_up2"=> "users/registrations#sign_up2", :as => "sign_up2_registration"
end

Раздел документации по Настройка маршрутов содержит следующее объяснение devise_scope:

Если вам нужна более глубокая настройка, например, разрешить «/sign_in» помимо «/users/sign_in», все, что вам нужно сделать, это создать свои маршруты обычным образом и обернуть их в блок devise_scope в маршрутизаторе.

Ранее Devise позволял передавать пользовательские маршруты в виде блока в devise_for, но это поведение устарело.

ОБНОВЛЕНИЕ:

Чтобы устранить ошибку First argument in form cannot contain nil or be empty, вам необходимо убедиться, что ваше пользовательское действие sign_up2 правильно устанавливает переменную resource. Предполагая, что вы хотите имитировать действие registrations/new, вы можете сделать что-то вроде следующего:

def sign_up2
    build_resource({})
    respond_with self.resource
end

Это гарантирует, что переменная resource в вашем представлении не будет nil и не вызовет исключение, которое вы сейчас наблюдаете.

В качестве альтернативы, в зависимости от поведения, которое вы пытаетесь продемонстрировать, вы можете установить свою собственную переменную экземпляра в пользовательском действии контроллера, а затем передать ее в качестве ресурса вашему тегу form_for:

# app/controllers/users/registrations_controller.rb
def sign_up_2
    @new_registrant = Registrant.new
end

# app/views/users/sign_up2.html.erb
<%= form_for(@new_registrant, :as => resource_name,:html => { :class => "form-horizontal col-sm-12",:role=>"form"}, :url => user_registration_path(resource_name)) do |f| %>

Однако если вы будете следовать этому подходу, вам следует подумать, почему вам нужно внедрить это в Devise. Devise по умолчанию назначает переменную resource через функцию build_resource. Если вы собираетесь переопределить/обойти эту функцию, вам следует рассмотреть возможность абстрагирования всей этой функциональности из Devise, поскольку вы полностью обходите ее поведение по умолчанию.

person zeantsoi    schedule 15.12.2013
comment
Большое спасибо, теперь я могу загрузить представление, но есть небольшая проблема. Не могли бы вы помочь? - person wwli; 16.12.2013
comment
В чем дело? Кроме того, если этот ответ касается вашего первоначального вопроса, примите его как правильный. - person zeantsoi; 16.12.2013
comment
Смотрите мое обновление. Если он полностью отвечает на ваш вопрос, примите этот ответ как правильный. - person zeantsoi; 16.12.2013