Отображение пользовательской формы sign_UP в любом месте вашего приложения - PullRequest
2 голосов
/ 16 июня 2011

Я хотел бы показать форму sign_UP в любом месте моего приложения.Я просто знаю, как это сделать с помощью формы sign_in, но с формой sign_up тот же метод не работает.

 [...]
<% unless user_signed_in? %> 
<%= form_for("user", :url => user_session_path) do |f| %> 
 [...]

Я много дней пытаюсь на форумах найти решение этой проблемы.Я надеюсь, что кто-то здесь может помочь мне.

Спасибо!

Ответы [ 2 ]

6 голосов
/ 17 июня 2011

Вот как мне удалось это сделать.

Я поместил регистрационную форму в мои home#index

Мои файлы:

view /home / index.html.erb

<%= render :file => 'registrations/new' %>

helper / home_helper.rb

module HomeHelper
  def resource_name
    :user
  end

  def resource
    @resource = session[:subscription] || User.new
  end

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

  def devise_error_messages!
    return "" if resource.errors.empty?

    messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join
    sentence = I18n.t("errors.messages.not_saved",
                      :count => resource.errors.count,
                      :resource => resource_name)

    html = <<-HTML
<div id="error_explanation">
<h2>#{sentence}</h2>
<ul>#{messages}</ul>
</div>
HTML

    html.html_safe
  end

end

Вам нужна эта часть, потому что Devise работает с чем-то, называемым resource и он должен быть определен так, чтобы вы могли позвонить вашему registration#new куда угодно.

Таким образом, вы сможете зарегистрироваться.Однако мне нужно было отображать ошибки на той же странице.Вот что я добавил:

layout / home.html.erb (макет, используемый при просмотре индекса)

<% flash.each do |name, msg| %>

  # New code (allow for flash elements to be arrays)
  <% if msg.class == Array %>
    <% msg.each do |message| %>
      <%= content_tag :div, message, :id => "flash_#{name}" %>
    <% end %>
  <% else %>

    # old code
    <%= content_tag :div, msg, :id => "flash_#{name}" %>

  <% end %> #don't forget the extra end
<% end %>

Я нашел этот код здесь

И вот что я создал: я сохранил свой ресурсный объект, если он недействителен в сеансе, чтобы пользователю не приходилось заполнять каждое поле снова.Я думаю, что есть лучшее решение, но оно работает, и мне этого достаточно;)

controller / registration_controller.rb

def create
    build_resource

    if resource.save
      if resource.active_for_authentication?
        # We delete the session created by an incomplete subscription if it exists.
        if !session[:subscription].nil?
          session[:subscription] = nil
        end

        set_flash_message :notice, :signed_up if is_navigational_format?
        sign_in(resource_name, resource)
        respond_with resource, :location => redirect_location(resource_name, resource)
      else
        set_flash_message :notice, :inactive_signed_up, :reason => resource.inactive_message.to_s if is_navigational_format?
        expire_session_data_after_sign_in!
        respond_with resource, :location => after_inactive_sign_up_path_for(resource)
      end
    else
      clean_up_passwords(resource)
      # Solution for displaying Devise errors on the homepage found on:
      # /2324987/relsy-razrabotka-obrabotka-deviseerrormessages
      flash[:notice] = flash[:notice].to_a.concat resource.errors.full_messages
      # We store the invalid object in session so the user hasn't to fill every fields again.
      # The session is deleted if the subscription becomes valid.
      session[:subscription] = resource
      redirect_to root_path #Set the path you want here
    end
  end

Я думаю, что не забыл ни одногокод.Не стесняйтесь использовать все, что вам нужно.

Ура!

0 голосов
/ 16 июня 2011

rails generate devise:install с консоли.Это создаст все виды разработок.После этого в представлении render 'devise/users/new' или что-то подобное, не могу проверить синтаксис сейчас.

...