рельсы позволяют не пользователям редактировать свой профиль - PullRequest
0 голосов
/ 07 декабря 2011

У меня есть сайт, который я создал в Rails 3.0 с установленным devise & cancan. Это приложение содержит список чуть более 4000 человек, которые могут просматривать участники. Очень немногие люди в базе данных являются членами.

Можно ли разрешить 4000 пользователям доступ только для обновления своего профиля, не делая их пользователем?

В настоящее время я думаю, что у меня будет три роли (администратор, участник и программа обновления). Роль программы обновления будет иметь доступ только к своему профилю и все. Я ограничу это использование cancan.

Это лучший способ сделать это? Я мог бы случайным образом сгенерировать пароль и отправить по электронной почте ссылку, чтобы отредактировать свой профиль в электронном письме, когда они щелкают по нему, моя программа может запросить их данные для входа и сразу же уйти. Я просто подумал, если бы это был лучший способ сделать это без необходимости генерировать так много пользователей.

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

Добавьте столбец к своей модели профиля со случайно сгенерированным паролем, затем добавьте ссылку для редактирования адреса электронной почты профиля с этим паролем на адрес электронной почты в файле для редактирования.

class Profile < ActiveRecord::Base
  def generate_edit_key!
    self.edit_key = rand(9999999999)
    save
  end
end

class ProfilesController < ApplicationController
  def request_edit_key
    @profile = Profile.find(params[:id])
    @proifle.generate_edit_key!
    ProfileMailer.edit_profile_request(@profile).deliver
    redirect_to @profile, :notice => 'Mail sent to profile owner'
  end
  def edit
    if current_user
      @profile = current_user.profile
    else
      @profile = Profile.find_by_id_and_edit_key(params[:id], params[:edit_key])
    end
  end
end

class ProfileMailer < ActionMailer::Base
  def edit_profile_request(profile)
    mail(:to => profile.email,
         :subject => 'Edit your profile',
         :body => "<%= link_to 'Click to edit' edit_profile_url(profile, :edit_key => profile.edit_key) %> If you didn't request this, please ignore.")
end
0 голосов
/ 07 декабря 2011

Если вы не хотите делать их пользователями, используйте систему токенов, чтобы предоставить им временный доступ для выполнения этой задачи.

link_to 'Let me update this profile', token_path(:id = @profile.id, :method => :post)

class TokensController < ApplicationController
  def create
    @profile = Profile.find(params[:id])
    if @profile.send_token!
      redirect_to profile_path(@profile), :notice => 'A token has been sent'
    else
      redirect_to profile_path(@profile), :error => 'A token could not be sent'
    end
  end
end

class Profile < ActiveRecord::Base
  has_many :tokens
  def send_token!
    token = self.tokens.create()
    TokenMailer.update_profile(token).deliver
  end
end

class Token < ActiveRecord::Base
  belongs_to :profile
  before_save :generate_key, set_expiration
  def generate_key
    self.key = rand(999999999999)
  end
  def set_expiration
    self.expires_at = 1.day.from_now
  end
  def expired?
    expires_at > Time.now
  end
end

class TokenMailer < ActionMailer::Base
  def update_profile(token)
    mail(:to => token.profile.email,
         :subject => 'Edit your profile',
         :body => "<%= link_to 'Click to edit' edit_profile_url(token.profile, :key => token.key) %>")
  end
end

class ProfilesController < ApplicationController
  def edit
    if params[:key]
      token = Token.find_by_key(params[:key])
      if token.expired?
        redirect_to root_url, :message => 'Token Expired'
      else
        @profile = token.profile
      end
    elsif current_user
      @profile = current_user.profiles.detect{|p| p.id == params[:id] }
    else
      redirect_to root_url, :message => 'Not allowed'
    end
  end
end
...