有一种更好的方法在Rails中验证?

时间:2014-02-03 15:38:55

标签: ruby-on-rails validation

下面的示例是我今天如何对用户进行身份验证:

def create
    if is_internal_request(params[:authenticity_token])
        @user = User.authenticate(params[:email], params[:password])

        if @user
            session[:user_id] = @user.id
            render :json => true
        else
            render :json => 
            { 
                error:
                {
                    code: 1, 
                    message: t('globals.errors.authentication.user-not-found') 
                } 
            }.to_json
        end
    end
end

注意这个片段:

render :json => 
{ 
    error:
    {
        code: 1, 
        message: t('globals.errors.authentication.user-not-found') 
    } 
}.to_json

基于此,我想知道它是否有条理且稳固。我的意思是,这是正确的方式吗?

前瞻性思维

让我们假设我的应用程序中有一些地方可以检查用户的电子邮件可用性。我想要干,并在每次需要使用它时重复使用该验证。如果我正在进行验证的方式(如下所示)根本不是“完美”,我怎样才能创建一个每次我都想要有用的验证层?

我的意思是,每次我想验证时,不是创建和重新创建代码片段,而是做这样的事情的最佳方式是什么?:

email = params[:email]

unless email_is_available(email)
    render :json => { message: 'E-mail isn't available' }
end

用“这样做的最佳方法是什么?”我说,我必须放置email_is_available功能才能让它正常工作?

3 个答案:

答案 0 :(得分:0)

每个Controller都可以访问ApplicationController方法。

无论如何,我建议使用像Devise这样的宝石来获得更完整的解决方案。

GL& HF。

答案 1 :(得分:0)

这样的事情怎么样?

  if @user.valid?
    render :json => true
  else
    error_hash = {}
    @user.errors.each{|k,v| error_hash[k] = "#{k.capitalize} #{v}"}
    #this will give you a hash like {"email" => "Email is not available"}
    render :json => {:errors => error_hash}
  end

在客户端,你将得到它(例如作为一个名为data的对象),看看是否有data.errors的值,然后向用户显示各种错误消息。

注意我没有插入任何翻译内容,但你可以这样做:)

答案 2 :(得分:0)

我建议您从头开始查看Ryan Bates的Railscast验证。它引导您解决所有问题,并且比依靠像Devise这样大而重的东西重量轻得多。

http://railscasts.com/episodes/250-authentication-from-scratch