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!