0

タイトルは自明だと思います...認証されたユーザーだけを作成して、デバイスを使用してユーザーを作成するにはどうすればよいですか? 新しいものを追加しようとすると(認証された場合)、デバイスは、これに対する回避策
はすでに認証されていると言いますか? どうもありがとう

編集:要求に応じて、私のコード

ユーザーフォーム

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

ルートの一部

App :: Application.routes.draw do

  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"
4

1 に答える 1

1

これを行う理想的な方法は、(ここregistrations_controller.rbに示すように)オーバーライドして、 andアクションのbefore_filterチェックをスキップすることです。自分でやろうとしたのですが、残念ながらうまくいきませんでした。newcreate

それを行う別の方法は、私にとってはうまくいきましたが、Deviseが提供する登録コントローラーとは別に別のユーザーコントローラーを作成することです。

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によって提供されるルートがまだ存在することです。そのための解決策は、Deviseが登録を含むルートを生成しないようにすることです。

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

これは、登録モジュールを完全に無視して、独自に作成することを意味します。このアイデアは、ベアボーンで簡素化されたDeviseチュートリアルから得ました。Deviseの登録モジュールによって提供されるものを置き換えるために、コントローラーのアクションとビューを作成する必要があることに注意してください。これには、、、、、、およびがnew含まれます。editcreateupdatedestroy

于 2012-04-25T04:24:32.507 に答える