Как мне объединить страницу входа и регистрации в Rails 3 с помощью Devise? - PullRequest
1 голос
/ 10 февраля 2011

Так вот как выглядит мой devise/sessions/new.html.erb:

<div id="sign_in">

<%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %>
            <%= f.text_field :f_name, :value => "First Name", :class => "clearField curved" %><div class="error"></div><br />
            <%= f.text_field :l_name, :value => "Last Name", :class => "clearField curved" %><div class="error"></div><br />
            <%= f.text_field :username, :value => "Username", :class => "clearField curved" %><div class="error"></div><br />
            <%= f.password_field :password, :value => "Password", :class => "clearField curved" %><div class="error"></div><br />
            <%= f.password_field :password_confirmation, :value => "Password", :class => "clearField curved" %><div class="error"></div><br />
            <%= f.text_field :email, :value => "Email Address", :class => "clearField curved" %><div class="error"></div><br />

        <div id="login_buttons">
            <%= f.submit "Sign in", :id => "login", :value => "Submit", :class => "curved" %>
            <%= f.submit "Sign in", :id => "register", :value => "Register", :class => "curved" %>
            <%= f.submit "Send Reset Instructions", :id => "pass-reset", :value => "Send Reset Instructions", :class => "curved"%>
            <a href="#" id="forgot-pw">Forgot pass?</a>
        </div>

    <% end %>

</div>

Вышеуказанное работает только для входа в систему (потому что :url => session_path(resource_name) а не registration_path).

То, что эта страница делает сейчас, - при загрузке страницы она скрывает все поля, кроме поля имени пользователя и пароля (то есть по умолчанию это страница входа в систему). Затем, когда они нажимают кнопку «Регистрация», она исчезает в других.

Однако, когда вы нажимаете кнопку отправки, это не работает - потому что неправильный обработчик формы управляет им.

Вот так выглядит моя обычная форма регистрации (которая работает, кстати) на devise\registrations\new.html.erb:

<h2>Sign up</h2>

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
  <%= devise_error_messages! %>

  <p><%= f.label :username %><br />
  <%= f.text_field :username %></p>

  <p><%= f.label :email %><br />
  <%= f.text_field :email %></p>

  <p><%= f.label :password %><br />
  <%= f.password_field :password %></p>

  <p><%= f.label :password_confirmation %><br />
  <%= f.password_field :password_confirmation %></p>

  <p><%= f.submit "Sign up" %></p>
<% end %>

<%= render :partial => "devise/shared/links" %>

Применимая часть моего файла маршрутов выглядит так:

devise_for :users, :path_names => { :sign_up => "register", 
                                  :sign_in => "login", 
                                  :sign_out => "logout" }

devise_scope :user do
    get "login", :to => "devise/sessions#new"
    get "register", :to => "devise/registrations#new"
    get "logout",   :to => "devise/sessions#destroy"

Итак, мне нужно следующее поведение:

Пользователь заходит в систему, видит только два поля формы (имя пользователя + пароль). Они нажимают ввод, он регистрирует их.

Если они нажимают «Зарегистрироваться», не выполняя загрузку страницы, я хотел бы, чтобы появилась правильная форма (с необходимыми дополнительными полями формы: имя, фамилия и т. Д.), И когда они нажимают ввод, она выполняет регистрацию. Я также хотел бы изменить URL-адрес с myapp.com/login на myapp.com/register - без загрузки страницы. Если они нажали «Войти», не заполнив форму, они должны вернуться на страницу входа (myapp.com/login), в которой отображаются только два поля (имя пользователя + пароль).

Таким образом, когда я ссылаюсь прямо на myapp.com/register, он переходит непосредственно на эту страницу с правильными полями формы и работает правильно.

В основном функциональность аналогична тому, как github теперь управляет просмотром репозитория без обновления страницы (но URL-адрес меняется).

Предложения

1 Ответ

1 голос
/ 27 апреля 2011

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

1) Скопируйте весь код из представлений / сессий / нового представления INTO / регистрации / нового
2) Изменитьпространство имен id / js кнопки отправки:

<%= f.submit 'submit_button', :style => "display: none", :id => "submitSignInForm" %><br>
<a class="button" href="javascript:document.getElementById('submitSignInForm').click();"> Sign in </a>"

3) Переопределить новый метод Devise Session Controller перенаправлением.
создать controllers / session_controller.rb и вставить следующий код,Обратите внимание, что класс контроллера наследуется от регистраций, а не сессий!

class SessionsController < Devise::RegistrationsController  
  def new
    redirect_to new_user_registration_path
  end
end

* Следует отметить, что это работало в rails 2.3.5, но я думаю, что оно будет работать в 3.0 так же.

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