2012-01-16 3 views
1

Для создания горшки меда поля я добавил к моей 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 I get:

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

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

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

ответ

6

Я согласен с 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 

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

EDIT

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

+0

Я пытался избежать создания RegistrationsController для разработки, поэтому я использовал его в модели, или мне не нужно это делать? Спасибо за советы, я тоже переименую поле. – LearningRoR

+0

Ваша модель не нуждается в дополнительных атрибутах, и вы должны сделать это в контроллере. Рендеринг или перенаправление с модели нарушает принципы архитектуры MVC. – shime

0

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

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

Смежные вопросы