3

私はRailsに非常に慣れていないため、少し苦労しています。

基本的なサインアップ、編集プロセスに従うユーザーがいます。

ユーザーが「部分登録」できる状況があります。つまり、既存のユーザーによる招待プロセスを介してそこに配置されたランダムなパスワードを持つデータベース内のユーザーの電子メールアドレスです。

データベースに技術的に既に存在する招待されたユーザーが登録しようとすると、ユーザーオブジェクトとテーブルの一意のインデックスに一意性チェックが適用されているため、「電子メールは既に存在します」と表示されます。

これをオフにし、create メソッド内で if ステートメントを使用して、ユーザーが存在するかどうかを確認し、他の値が更新または新規作成されて保存されていることを確認しました。すべての if 条件が無視され、新しいユーザーが作成されました。

私がしたいのは、ユーザーを「作成」するのと同じ登録フォームを使用して、既存の「部分登録済み」ユーザーを入力したパスワードと名前 (電子メールアドレスチェック) で更新し、他のデータベースフラグが true に設定されている場合です。ユーザーが存在するが条件が満たされていない場合は、「パスワードを忘れた」ページをロードするか、ユーザーが新しいユーザーである場合は作成して保存します。

上記を達成する方法についての支援やアドバイスは素晴らしいでしょう。

ありがとう

ヴィッキー


これが私のセットアップです:

ユーザークラス

class User < ActiveRecord::Base
  attr_accessor :password
  attr_accessible :email, :name, :password, :password_confirmation, :tandc

  email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

  validates :name, :presence => true,
                   :length => { :maximum => 50 }

  validates :email, :presence => true,
                    :format => {:with => email_regex },
                    :uniqueness => { :case_sensitive => false }

  validates :password,  :presence => true,
                        :confirmation => true,
                        :length => { :within => 6..40 }

  validates :tandc, :presence => true

  before_save :encrypt_password
  .
  .
  .
end

私は次のUsersControllerを持っています

  def new
    @user = User.new
    @title = "Sign Up"
  end

def create
 if @user.save
    sign_in @user
    redirect_to @user
 else
    @title = "Sign up"
    render 'new'
 end
end

def update
  if @user.update_attributes(params[:user])
    redirect_to @user
  else
   @title = "Edit"
   render 'edit'
  end
end
.
.
.

ビューがあります: user > new.html.erb

<%= form_for(@user, :html => { :class => "validateUser", :name =>"edit_user"}) do |f| %>
  .
  .
  .
  form stuff here
  .
  .
  .
<% end %>

およびユーザー> edit.html.erb

  <%= form_for(@user, :html => { :class => "validateUser", :name =>"edit_user"}) do |f| %>
  .
  .
  .
  form stuff here
  .
  .
  .
  <% end %>

ユーザーのルートは次のとおりです

    users GET    /users(.:format)                users#index
          POST   /users(.:format)                users#create
 new_user GET    /users/new(.:format)            users#new
edit_user GET    /users/:id/edit(.:format)       users#edit
     user GET    /users/:id(.:format)            users#show
          PUT    /users/:id(.:format)            users#update
          DELETE /users/:id(.:format)            users#destroy
4

5 に答える 5

2

誰かがサイトに登録すると、ログインする前にアカウント確認メールを送信できます。メールには、システム生成トークン (「User.token」など) へのリンクが含まれています。ユーザーがリンクをクリックすると、verification_controller がユーザーをトークンで取得し、パスワードを設定できるようにします。

# In class User < ActiveRecord::Base
# Give the user a unique, random token
user.token = SecureRandom.urlsafe_base64(20)

# In class VerificationsController < ApplicationController
# Retrieve the user with their token
@user = User.find_by_token(params[:token])

それでは、あなたのケースを考えてみましょう。招待されたユーザーが招待を受け入れる前に登録を試みた場合でも、アカウント確認メールを送信できます。これで、1) 招待から、2) 登録からの 2 つのメールが届きます。関係ありません...リンクをクリックしてパスワードを設定するだけです。

アカウントにアクセスする方法を提供するため、おそらくトークンを期限切れにする必要があります。一般的な認証フレームワークである AuthLogicには、役立つパスワード リセットのチュートリアルがあります。同様の手法を示しており、手作りのソリューションのアイデアが得られるかもしれません。

于 2012-10-26T13:22:09.127 に答える
2

の行に沿って何かを使用User.find_or_initialize_by_email(:email => params[:user_email])して、User オブジェクトを取得できます。

基本的にfind_or_initialize、データベースからユーザーを取得しようとします。取得に失敗した場合は、後で保存できる新しいユーザーを作成します。

User オブジェクトを取得したら、そのフィールドに対して必要なことを実行し、結果をデータベースに保存できます (古いエントリを更新するか、新しいエントリを作成します)。

(注: User が以前に存在していたかどうかを確認したい場合は、.persisted?によって返されたオブジェクトで使用しfind_or_initializeます。これは、データベースに既に存在していたかどうかを示すブール値を返します。)

于 2012-10-26T13:20:15.737 に答える
1

users_controller.rbで試すことができます

def edit
  @user = User.find(params[:id])
end

def update
  @user = User.find(params[:id])

  respond_to do |format|
    if @user.update_attributes(params[:user])
      format.html { redirect_to @collection, 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

ビューへのリンクを追加

<%= link_to content_tag(:span, "Edit"), edit_user_path(@user), :class => 'edit' %> 

new.html.erbでフォームを削除し、追加します

<%= render 'form' %>

(これにより、フォームコードを追加する部分がレンダリングされます)

_form.html.erbを作成し、これにフォームコードを追加します

次に、edit.html.erbビューを作成し、コードを追加します

<%= render 'form' %>
于 2012-10-26T13:13:24.387 に答える