2012-04-24 10 views
0

タイトルは自明です...認証されたユーザーのみを作成してユーザーを作成するにはどうすればよいですか?
新しいものを追加しようとすると(認証されたとき)、私はalreadeが認証されていると言います
これに対する回避策はありますか?
おかげでたくさん認証されたユーザーだけが新しいユーザーを作成できるようにする方法

編集:要求されたとして、私のコード

ユーザーフォーム

<% if @user == current_user %> 
<i class="icon-info-sign"> </i><i>Após alterar seus dados, você terá de fazer login novamente</i> 
<% end %> 

<%= form_for(@user, :html => { :class => "well form-horizontal"}) do |f| %> 
    <% if @user.errors.any? %> 
    <div class="alert alert-error"> 
     <h2><%= pluralize(@user.errors.count, "erro") %> 
     <% if @user.errors.count == 1 %> impede 
      <% else %> 
      impedem 
     <% end %> 
     a continuação:</h2> 

     <ul> 
     <% @user.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 


<label>Nome</label><%= f.text_field :nome %> 
<label>E-mail</label><%= f.email_field :email %> 

<% if @user == current_user or @user.created_at == nil%> 
    <label>Senha</label><%= f.password_field :password %> 
<% end %> 

<div> 
<br /> 
<button class="btn" type="submit"> 
    Salvar alterações 
</button> 

</div> 

<% end %> 

ユーザーコントローラの一部

before_filter :authenticate_user! 
    def index 
    @users = User.all 

    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @users } 
    end 
    end 

    # GET /users/1 
    # GET /users/1.json 
    def show 
    @user = User.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.json { render json: @user } 
    end 
    end 

    # GET /users/new 
    # GET /users/new.json 
    def new 
    @user = User.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @user } 
    end 
    end 

    # GET /users/1/edit 
    def edit 
    @user = User.find(params[:id]) 
    end 

    # POST /users 
    # POST /users.json 
    def create 
    @user = User.new(params[:user]) 

    respond_to do |format| 
     if @user.save 
     format.html { redirect_to @user, notice: 'User was successfully created.' } 
     format.json { render json: @user, status: :created, location: @user } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /users/1 
    # PUT /users/1.json 
    def update 
    @user = User.find(params[:id]) 

    respond_to do |format| 
     if @user.update_attributes(params[:user]) 
     format.html { redirect_to @user, notice: 'User was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: "edit" } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

アプリケーションコントローラ

class ApplicationController < ActionController::Base 
    protect_from_forgery 

    def after_sign_in_path_for(resource) 
     return request.env['omniauth.origin'] || stored_location_for(resource) || painel_path 
    end 
end 

経路の一部

アプリ:: Application.routes.drawはそれを行うための理想的な方法は、(hereに示すように)registrations_controller.rbを上書きすることであろう

resources :acampantes 

    devise_for :users, :skip => [:registrations] 

    resources :profiles 

    resources :eventos do 
    resources :acampantes 
    end 

    # aqui tem um has_many, mas não precisa de nested routes 
    resources :noticias 
    resources :users#, :as => "usuarios" 
+1

何かをコード化しましたか?あなたが試したことを教えてください。 –

+0

まあ...私はUserモデルにdeviseをインストールし、deviseビューを生成しました...何も変更していません。ここに私の 'User'クラスがあります:https://gist.github.com/2484961 edit:'/users/sign_up'で新しいユーザーを追加しようとすると 'あなたはすでにログインしています 'というメッセージが表示されます。 '/ users/new'と同じメッセージ –

答えて

1

を行うとbefore_filterチェックをスキップして、newcreateアクションを確認してください。私は自分でそれをやろうとしましたが、残念ながら正しいことはできませんでした。

私のために働いたそれを行うための別の方法、工夫が提供する登録コントローラとは別に独立したユーザコントローラを作成するには、次のようになります。

class UsersController < ApplicationController 
    before_filter :authenticate_user! 

    def new 
    @user = User.new 
    end 

    def create 
    @user = User.new(params[:user]) 
    if @user.save 
     flash[:success] = "User saved" 
     redirect_to @user 
    else 
     render 'new' 
    end 
    end 
end 

# routes.rb 
ApplicationName::Application.routes.draw do 
    devise_for :users 
    resources :users, :only => [:new, :create] 
end 

次に、新しいアクションのためのフォームを作る:

# app/views/users/new.html.erb 
<%= form_for(@user) do |f| %> 

    <div><%= f.label :email %><br /> 
    <%= f.email_field :email %></div> 

    <div><%= f.label :password %><br /> 
    <%= f.password_field :password %></div> 

    <div><%= f.label :password_confirmation %><br /> 
    <%= f.password_field :password_confirmation %></div> 

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

このアプローチの問題は、サインアップのためにDeviseによって提供されたルートがまだ存在することです。そのための解決策は、登録を含む生成ルートから工夫を防ぐために、次のようになります。これは、あなたが完全に登録モジュールを無視し、独自のを作るしようとしていることを意味

# routes.rb 
devise_for :users, :skip => [:registrations] 

。私はこの考えをBare-bone, stripped-down Devise tutorialから得ました。あなたがDeviseの登録モジュールによって提供されたアクションとビューを置き換えるようにコントローラのアクションとビューを作成する必要があることに注意してください。これには、new,edit,create,update、およびdestroyが含まれます。

+0

は':skip => [:registrations] 'が追加されました。私はすでに新しいユーザーフォームを持っていました。ありがとうございました –

+0

大丈夫、**ほぼすべてが働いていました...私は新しい 'User'を作成した後、私のアプリを蹴飛ばそうとしています。何か案は? –

+0

「キックアウト」とはどういう意味ですか?あなたはアプリからサインアウトすることを余儀なくされましたか? –

関連する問題