Перенаправление, когда атрибут присутствует? - PullRequest
1 голос
/ 16 января 2012

Для создания полей с медовыми горшками я добавил в свою модель User виртуальный атрибут, который при заполнении отправит пользователя обратно на корневую страницу:

class User < ActiveRecord::Base
  attr_accessible :email, :password, :remember_me, :username, :fake_field
  attr_accessor :fake_field
  devise :database_authenticatable, :registerable............
  before_create :setup_default_role_for_new_users

  ROLES = %w[admin default banned]

  def self.fake_field(string)
  end

  private

  def setup_default_role_for_new_users
    if self.fake_field.present?
        redirect_to root_url
    end
    if self.role.blank?
      self.role = "default"
    end
  end
end

Форма работает для регистрации, но когдазаполняя fake_field я получаю:

undefined local variable or method `root_url' for #<User:0x5a06618>

Это нормально?Разве это не сделает 404 для бота?

В идеале я бы хотел, чтобы боты высадили страницу с ошибкой 404.

Ответы [ 2 ]

6 голосов
/ 16 января 2012

Я согласен с MasterBlaster, это задача для контроллера.Вам также не нужен атрибут fake_field в вашей модели.

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

<%= text_field_tag :email_confirmation, :style => "display: none" %>

вэту форму.

Затем добавьте это в метод вашего контроллера, где вы хотите проверить, пытается ли бот ввести:

class UsersController < ApplicationController

    def create
      render :status => 200 and return unless params[:email_confirmation].blank?
      # (your code)
      # ...        
   end

end

Я также предлагаю вам переименовать ваше поле приманки во что-нибудьболее умный (например, «подтверждение по электронной почте»), поскольку боты, как правило, достаточно умны в поиске «поддельных» полей.

РЕДАКТИРОВАТЬ

Вам также не нужноСообщите боту, что его действия не увенчались успехом, нет необходимости быть вежливым.Ответьте с хорошим 200 (OK).Я обновил свой пост соответственно.

0 голосов
/ 16 января 2012

Вы не должны делать перенаправление внутри вашей модели.Эта проверка должна быть сделана в контроллере.Вы можете использовать before_filter в вашем контроллере и использовать метод для проверки и перенаправления.

У вас нет доступа к этому вспомогательному методу root_url внутри модели.Во всяком случае, это был бы неправильный способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...