2

目前加入了很多rails 3的练习,我正在开发一个认证系统,并且正在关注railscasts上的教程。来自railscast的Ryan对该教程做了一些更新,并稍作修改以利用rails 3.1代码何时属于模型中的红宝石轨?

has_secure_password

因此,一些在我的Sessions_controller的代码更改为:

class SessionsController < ApplicationController 
    def new 
    end 

    def create 
    user = User.find_by_username(params[:username]) 
    if user && user.authenticate(params[:password]) 
     session[:user_id] = user.id 
     redirect_to root_path, :notice => "Logged In" 
    else 
     flash.now.alert = "Invalid Credentials" 
     render "new" 
    end 
    end 

    def destroy 
    session[:user_id] = nil 
    redirect_to root_path, :notice =>"Logged Out" 
    end 

end 

我想知道的是,如果一些代码的创建方法/动作应该是在模型?在这里使用这些代码是好的还是不好的做法?

我应该遵循什么规则,因为我想要学习正确的方法,而不是捡到坏习惯,因为我已经超越了学习框架的一部分,在这个框架中,事情开始比平常更有意义。

建议是欣赏..

我想特别知道的是..
1.当没有一个程序员的代码时,在模型中属于知道些什么?他/她如何做出这个决定?

回答

3

这是面向对象编程中最重要的问题之一。

这是关于责任。如果您认为该模型负责该部分功能,请将代码放置在您的模型中。

在您的例子,你看到:

  • SessionController只负责创建和销毁该用户的会话。
  • User负责认证。

所有业务逻辑都会进入您的模型。您的控制器负责填充您的视图,处理用户的输入并在他们的路上发送用户。查看只是显示信息,几乎不包含任何逻辑(如果有)。

另外:看看现有的项目灵感(例如,Shopify)。

+0

谢谢,这个答案为我解决了一些问题。 – LondonGuy

0

我的建议是:

在用户模式(伪):

function authenticate(username, pass) { 
    /*get user by name 
    return user_id (or user object if you need some user data in view) if auth ok, otherwise false 
    */ 
} 

我认为你应该始终保持控制器越小越好。 在OOP中最重要的思想是封装,所以你应该在用户类中编写用户的所有操作,返回客户端代码(在这种情况下控制器)只有控制器需要做他的工作 - 添加用户ID会话。

+0

-1?我的答案错在哪里? – drupality