属性存在时重定向?

时间:2012-01-16 16:27:33

标签: ruby-on-rails ruby-on-rails-3 devise

要创建Honey pots字段,我在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 个答案:

答案 0 :(得分: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

我还建议你将蜜罐字段重命名为更聪明的东西(例如“电子邮件确认”),因为机器人在寻找“虚假”字段方面往往非常聪明。

修改

您也不需要通知机器人他的行为不成功,也没有必要礼貌。回复一个不错的200 (OK)。我已相应更新了我的帖子。

答案 1 :(得分:0)

您不应该在模型中重定向。此检查应在控制器中完成。 您可以在控制器中使用before_filter,并使用其中的方法进行检查和重定向。

您无法访问模型中的此辅助方法root_url。无论如何,这是错误的做法。