2017-06-07 3 views
1

Für meine Website, ich versuche, einen Weg zu finden, wo, wenn ein Benutzer angemeldet ist, dann können sie einen Benutzer für jemanden erstellen. Für die Website möchte ich nicht, dass jemand sich anmeldet. Nur ein Benutzer kann jemanden aus Sicherheitsgründen anmelden. Ich kann nicht herausfinden, wie das geht. Ich benutze das Gerät für die Anmeldung/Anmeldung.Schienen: Angemeldeter Benutzer kann einen neuen Benutzer erstellen

Ich poste etwas von meinem Code, aber ich bin mir nicht sicher, welche ich posten sollte, noch neu zu Schienen.

Hier möchte ich den Link einen Benutzer erstellen/anmelden. Die Anmeldeseite sollte nur angezeigt werden, wenn ein Benutzer angemeldet ist.

<!DOCTYPE html> 
<html> 
... 
    <body> 
    <div class = "auth"> 
     <% if !user_signed_in? %> 
     <button class = "signed_in"><%= link_to "Login", new_user_session_path %></button> 
    <% end %> 

    <% if user_signed_in? %> 
     <div class = "buttons"> 
      <button class = "button"><%= link_to("Logout", destroy_user_session_path, :method => :delete) %> </button> 

     </div> 
    <% end %> 
    </div> 
    <p class="notice"><%= notice %></p> 
    <p class="alert"><%= alert %></p> 

    <%= yield %> 
    </body> 
</html> 

Ich werde dies auch posten. Ich denke, so funktionieren die Links bei der Authentifizierung.

<%- if controller_name != 'sessions' %> 
    <%= link_to "Log in", new_session_path(resource_name) %><br /> 
<% end -%> 

<%- if devise_mapping.registerable? && controller_name != 'registrations' %> 
    <%= link_to "Sign up", new_registration_path(resource_name) %><br /> 
<% end -%> 

<%- if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' %> 
    <%= link_to "Forgot your password?", new_password_path(resource_name) %><br /> 
<% end -%> 

<%- if devise_mapping.confirmable? && controller_name != 'confirmations' %> 
    <%= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name) %><br /> 
<% end -%> 

<%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %> 
    <%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name) %><br /> 
<% end -%> 

<%- if devise_mapping.omniauthable? %> 
    <%- resource_class.omniauth_providers.each do |provider| %> 
    <%= link_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", omniauth_authorize_path(resource_name, provider) %><br /> 
    <% end -%> 
<% end -%> 

Hier ist, wo ich rate, wie Sie sich anmelden. Ich möchte, dass diese Seite nur angezeigt wird, wenn ein Benutzer angemeldet ist. Das Problem, dass ich sehe, dass ein Benutzer THNIK nur auf die Anmeldeseite gelangen kann, wenn er oder sie ausgeloggt ist. Ich möchte, dass die Anmeldeseite NUR angezeigt wird, wenn ein Benutzer angemeldet ist. Nicht sicher, wie das funktioniert.

<article class = "sign" > 

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

    <div class="field"> 
    <%= f.label :email %><br /> 
    <%= f.email_field :email, autofocus: true %> 
    </div> 

    <div class="field"> 
    <%= f.label :password %> 
    <% if @minimum_password_length %> 
    <em>(<%= @minimum_password_length %> characters minimum)</em> 
    <% end %><br /> 
    <%= f.password_field :password, autocomplete: "off" %> 
    </div> 

    <div class="field"> 
    <%= f.label :password_confirmation %><br /> 
    <%= f.password_field :password_confirmation, autocomplete: "off" %> 
    </div> 

    <div class="actions"> 
    <%= f.submit "Sign up" %> 
    </div> 
<% end %> 


<%= render "devise/shared/links" %> 
</article> 

Ich stellte auch die Migration Code sieht wichtige

class DeviseCreateUsers < ActiveRecord::Migration[5.1] 
    def change 
    create_table :users do |t| 
     ## Database authenticatable 
     t.string :email,    null: false, default: "" 
     t.string :encrypted_password, null: false, default: "" 

     ## Recoverable 
     t.string :reset_password_token 
     t.datetime :reset_password_sent_at 

     ## Rememberable 
     t.datetime :remember_created_at 

     ## Trackable 
     t.integer :sign_in_count, default: 0, null: false 
     t.datetime :current_sign_in_at 
     t.datetime :last_sign_in_at 
     t.string :current_sign_in_ip 
     t.string :last_sign_in_ip 

     ## Confirmable 
     # t.string :confirmation_token 
     # t.datetime :confirmed_at 
     # t.datetime :confirmation_sent_at 
     # t.string :unconfirmed_email # Only if using reconfirmable 

     ## Lockable 
     # t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts 
     # t.string :unlock_token # Only if unlock strategy is :email or :both 
     # t.datetime :locked_at 


     t.timestamps null: false 
    end 

    add_index :users, :email,    unique: true 
    add_index :users, :reset_password_token, unique: true 
    # add_index :users, :confirmation_token, unique: true 
    # add_index :users, :unlock_token,   unique: true 
    end 
end 

Wie ich schon sagte, ich bin nicht ganz sicher, was Code, den ich für die Führung abgeben sollte. Lass mich wissen, ob ich mehr posten sollte, um herauszufinden, wie das geht.

Auch zu beachten, ich habe derzeit keinen Code in meinem Benutzer-Controller, vielleicht muss ich Sachen hinzufügen, damit dies funktioniert?

+0

Dies sollte Ihnen irgendwie helfen https://stackoverflow.com/questions/23140117/allow-a-user-to-add-new-users-in-devise-and-remain-logged-in-as-selbst – Pavan

Antwort

0

Das gleiche wie Sie es tun, um zu überprüfen, ob der Benutzer in und mit den Tasten drucken signiert ist, können Sie einen neuen link_to Helfer hinzuzufügen, die erstellt einen neuen Weg weist diese Arbeit zu machen:

# html.erb file (mostly application.html.erb) 
<div class="auth"> 
    <% if !user_signed_in? %> 
    <button class="signed_in"> 
     <%= link_to 'Login' new_user_session_path %> 
    </button> 
    <% else %> 
    <div class="buttons"> 
     <button class="button"> 
     <%= link_to('Logout', destroy_user_session_path, method: :delete) %> 
     </button> 
     <button class="button"> 
     <%= link_to 'Create a new account', new_account_path %><br /> 
     </button> 
    </div> 
    <% end %> 
</div> 

Sie benötigen einen neuen Controller zu schaffen, die von der Devise erbt RegistrationsController, die die Devise new Verfahren werden außer Kraft gesetzt, und verwendet die skip_before_action (Schienen 5, für Schienen 4 Verwendung skip_before_filter) Rückruf, um es mit der overrided Methode funktioniert:

# app/controllers/registrations_controller.rb 
class RegistrationsController < Devise::RegistrationsController 
    skip_before_action :require_no_authentication, only: [:new] 

    def new 
    super 
    end 
end 

Dann in Ihren Routen Sie die registrations_controller hinzufügen, um es mit Devise funktioniert:

# config/routes.rb 
devise_for :users, controllers: { registrations: 'registrations' } 

Und als angemeldeten Benutzer definiert eine GET Route, die in den link_to Helfern mit dem verwendeten entsprechen im ersten Schritt erstellt:

# config/routes.rb 
as :user do 
    get '/new_account', to: 'registrations#new' 
end 

Here gibt es ein Repo, um zu sehen, wie es funktioniert. Ich hoffe es hilft.

+0

Was wäre der Befehl, um den neuen Controller für die Registrierung zu erstellen? wäre es Schienen generieren Controller Registrierung Devise: Referenzen? – bockdavidson

+0

Wenn Sie einen Befehl wünschen, würde 'rails generate controller Registrations' einen neuen erstellen, und auch alle damit verbundenen Dateien, oder Sie können es manuell tun, indem Sie sorgfältig im Namen angeben, von welchem ​​Controller er erbt. –

+0

Danke! es funktionierte! Gibt es eine Möglichkeit, dass nur bestimmte Benutzer einen neuen Benutzer basierend auf ihrer E-Mail-Adresse erstellen können? – bockdavidson

Verwandte Themen