2016-07-13 10 views
0

Ich habe sowohl meine Login und Anmeldeformulare auf der gleichen Seite. Ich versuche zu spezifizieren, welche "Post" -Route basierend darauf genommen werden sollte, welches Formular gerade ausgefüllt wird. Der Post des Anmeldeformulars sollte an die Aktion create_user gesendet werden und der Post des Anmeldeformulars sollte an die create-Aktion gesendet werden. Bilden Sie einen Grund unabhängig von dem, was ich in der Ansicht angeben, die create_user Aktion - auch für das Login-Formular.Schienen spezifizieren Routen

Routen:

get '/login' => 'sessions#new', as: :users 
    post '/login' => 'sessions#create_user' 
    post '/login' => 'sessions#create' 

Ausblick:

<div class="forms"> 

    <div class="login"> 

     <h3>Login</h3> 

     <%= form_for(:session, url: {action: "create"}) do |x| %> 
      <%= x.email_field :email, :placeholder => " Email", :style => "height:50px; width:350px; border: solid #ff4d4d; background-color:#eff5f5; margin-top:20px; padding-left:5px;" %> 
      <%= x.password_field :password, :placeholder => " Password", :style => "height:50px; width:350px; border: solid #ff4d4d; background-color:#eff5f5; margin-top: 35px; padding-left:5px;" %> 
      <%= x.submit "Login" %> 
     <% end %> 

    </div> 

    <div class="divide"></div> 

    <div class="signup"> 

     <h3>Signup</h3> 

     <%= form_for @new_user, url: {action: "create_user"} do |x| %> 
      <%= x.text_field :name, :placeholder => " Name", :style => "height:50px; width:350px; margin-top:20px; border: solid #ff4d4d; background-color:#eff5f5; padding-left:5px;" %> 
      <%= x.email_field :email, :placeholder => " Email", :style => "height:50px; width:350px; margin-top:35px; border: solid #ff4d4d; background-color:#eff5f5; padding-left:5px;" %> 
      <%= x.password_field :password, :placeholder => " Password", :style => "height:50px; width:350px; margin-top:35px; border: solid #ff4d4d; background-color:#eff5f5; padding-left:5px;" %> 
      <%= x.submit "Submit" %> 
     <% end %> 

    </div> 

</div> 

Controller:

class SessionsController < ApplicationController 
def new 
    @new_user = User.new 
end 

def create 
    @user = User.find_by_email(params[:session][:email]) 
    if @user && @user.authenticate(params[:session][:password]) 
     session[:user_id] = @user.id 
     redirect_to '/' 
    else 
     render '/login' 
    end 
end 

def create_user 
    @new_user = User.new(user_params) 
    if @new_user.save 
     session[:user_id] = @new_user.id 
     redirect_to '/' 
    else 
     render '/login' 
    end  
end 

def destroy 
    session[:user_id] = nil 
    redirect_to '/login' 
end 

private 
def user_params 
    params.require(:user).permit(:name, :email, :password) 
end 

Antwort

0

Du es seltsam zu tun, aber das sollte funktionieren. . . diese

Wechsel:

<%= form_for @new_user, url: {action: "create_user"} do |x| %> 

Um dies:

<%= form_for @new_user, url: url_for(controller: 'sessions_controller', action: 'create_user') do |x| %> 

sollten Sie wahrscheinlich die create user Sachen in einen anderen Controller Erwägung ziehen (a Userscontroller). Wenn Sie Ihre Routen richtig konfigurieren (fügen Sie resources :users hinzu), müssen Sie nur form_for @new_user verwenden, ohne zu sagen, auf welchen Controller/welche Aktion zu posten ist.

+0

Nach dem Hinzufügen der Benutzerressourcen und Verschieben der neuen und create_user Aktionen in den Benutzer-Controller bekomme ich jetzt einen Argumentfehler, und ich denke, es ist, weil ich die Variable '@new_user' in der neuen Ansicht der Sitzung verwenden, während die Variable nur ist Präsentieren Sie in den Benutzern neue und erstellen Sie Aktionen. Wie behebe ich das? @Encylyr – nums

+0

@nums Da das ein anderes Problem ist, schlägt angemessene Etikette auf Stapelaustausch vor, dass Sie diese korrekte Antwort stimmen, markieren Sie es als richtig, dann machen Sie eine neue Frage dafür :). – Ecnalyr

+0

Ok, kann ich Sie auf die neue Frage verlinken? @ Ecnalyr – nums