2 Stimmen

Anzeige eines benutzerdefinierten sign_UP-Formulars an beliebiger Stelle in Ihrer Anwendung

Ich möchte irgendwo in meiner Anwendung ein sign_UP-Formular anzeigen. Ich weiß nur, wie man dies mit einem sign_in-Formular zu tun, aber mit dem sign_up-Formular, die gleiche Methode dont Arbeit.

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

Ich versuche seit vielen Tagen, in den Foren eine Lösung für dieses Problem zu finden. Ich hoffe, jemand hier kann mir helfen.

Gracias.

6voto

Lucas Punkte 2876

So habe ich es gemacht.

Ich habe ein Anmeldeformular in meinem home#index

Meine Dateien:

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

Sie brauchen diesen Teil, weil Devise mit etwas arbeitet, das resource und sollte definiert werden, damit Sie Ihre registration#new überall.

Auf diese Weise sollten Sie sich anmelden können. Ich musste jedoch Fehler auf derselben Seite anzeigen. Hier ist, was ich hinzugefügt habe:

layout/home.html.erb (das von der Indexansicht verwendete Layout)

<% 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 %>

Ich habe folgenden Code gefunden ici

Und hier ist etwas, das ich geschaffen habe: Ich habe mein Ressourcenobjekt in einer Sitzung gespeichert, wenn es ungültig ist, so dass der Benutzer nicht jedes Feld erneut ausfüllen muss. Ich vermute, dass es eine bessere Lösung gibt, aber es funktioniert und es reicht mir ;)

controller/registrierung_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:
      # https://stackoverflow.com/questions/4101641/rails-devise-handling-devise-error-messages
      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

Ich glaube, ich habe keinen Code vergessen. Sie können jeden Code verwenden, den Sie brauchen.

Zum Wohl!

0voto

Mikhail Nikalyukin Punkte 11818

rails generate devise:install von der Konsole aus. Dadurch werden alle Geräteansichten generiert. Danach wird in der Ansicht render 'devise/users/new' oder etwas Ähnliches, kann die Syntax jetzt nicht überprüfen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X