属性存在时重定向?

Lea*_*RoR 1 ruby-on-rails devise ruby-on-rails-3

为了创建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
Run Code Online (Sandbox Code Playgroud)

该表单适用于注册,但填写时fake_field我得到:

undefined local variable or method `root_url' for #<User:0x5a06618>
Run Code Online (Sandbox Code Playgroud)

这个可以吗?这不会为机器人渲染404吗?

理想情况下,我想让机器人登陆404错误页面.

shi*_*ime 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
Run Code Online (Sandbox Code Playgroud)

我还建议你将蜜罐字段重命名为更聪明的东西(例如"电子邮件确认"),因为机器人在找到"假"字段时往往非常聪明.

编辑

你也不需要告知机器人他的行动是不成功的,没有必要礼貌.回应一个不错的200 (OK).我已相应更新我的帖子.