Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 有更好的方法在Rails中进行验证吗?_Ruby On Rails_Validation - Fatal编程技术网

Ruby on rails 有更好的方法在Rails中进行验证吗?

Ruby on rails 有更好的方法在Rails中进行验证吗?,ruby-on-rails,validation,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

下面的示例是我今天如何验证我的用户:

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

“做这样的事情最好的方法是什么?”我是说,我必须把
电子邮件放在哪里才能正常工作?
功能可用吗?

每个控制器都可以访问继承自它的
ApplicationController
方法

无论如何,我建议使用gem-like来获得更完整的解决方案


GL&HF.

像这样的东西怎么样

  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的值,然后向用户显示各种错误消息


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

我建议您查看Ryan Bates的Railscast,从头开始进行身份验证。它会引导你解决所有的问题,而且比依靠像Desive这样又大又重的东西要轻得多


谈论良好实践(注意:良好实践,而不是模式):将验证行为放置在
应用程序控制器中是一种很好的做法
?它取决于代码的扩展/模块性/etc是否值得拥有自己的模块。
@user。错误
来自
用户
模型的验证标志,对吗?是的。这是作为调用@user.valid的副作用填充的。我们这里有一个问题,因为
@user.valid
@user.errors
都不存在。它的
.valid?
(带问号)不是
.valid
。尽管它在您的Rails版本中可能已更改,但请检查相应的API文档。