Rails 将业务操作放在 controller 里破坏了 rails 中的 MVC 结构吗?

douya0808 · 2012年04月01日 · 最后由 jhjguxin 回复于 2012年04月01日 · 2892 次阅读

Q1:偶然看网上别人的留言说将业务操作放在 controller 就像放在了 Servlet 中一样,说 controller 应该只负责接收前台参数然后再交给更后面的 models 处理 是这样的吗?

Q2:如果我想调用 models 里面的 XX.rb 文件来执行业务操作,我用的表叫做 admins,所以我的 model 叫做 admin.rb 但是我用到的 controller 叫做 login_controller.rb,在 login_controller.rb 中如何调用 admin.rb 中的方法呢?是不是他俩的名字相同才能形成映射呢?

如果是类方法,直接Admin.方法名,如果是实例方法,要有个实例,比如@admin,然后@admin.方法名

试着把前天写的登录,都写在 controller 中的实现分成 controller 只接收参数,然后 model 来处理,再根据返回结果决定往哪里跳转

def login                                                                       #login_controller.rb中的方法
     @name=params[:admin][:name]                               #获取前台帐号   
     @password=params[:admin][:password]                   #获取前台密码
     login=Login.new                                                      #为了调用model中的类,申请了个对象
     @result=login.logintest(@name,@password)             #通过方法将帐号密码传过去
     redirect_to :controller=>"students",:action => "index",:notice => 'success' if @result=="success"                                                     #如果返回的是“success”跳往成功
     redirect_to(:action => "fail") if @result=="fail"             #如果返回的是“fail”跳往失败页面
  end

class Login     #login.rb中的类,因为没有logins表,故没写后面的(<ActiveRecord::Base)
  def logintest(name,password)
    @user=Admin.find_by_name_and_password(name,password)
    if @user                                                                   #如果帐户存在,返回"success"字符串
      "success"
    else
      "fail"                                                                       #如果帐户不存在,返回"fail"字符串
    end
  end
end

之前好用的代码被我这么一改就不好用了,报错 (Couldn't find Admin without an ID) 奇怪的是我之前登录也没用输过 ID 呀 但是我的思路是对的吧?嘿嘿 @zhaoguobin 那都写成 find 那样的类方法岂不是很方便,不然 ror 中也有像 spring 那样的框架解决什么依赖注入之类的问题吗:)

不需要同名,Admin 里的类就是类,已经被包含进来了,直接用就可以了

@azhao 如果有表,名为 tables 那就有个 table.rb 的 model 里面是 class Table < ActiveRecord::Base 如果只是想要个干活的类,那自己建个 work.rb 里面写自己的类 class Work 就行了吧?或者在 helpers 的 module 里写然后再引进来呢?嘿嘿嘿:)

#2 楼 @douya0808 没必要单独写一个 login class,你如果数据是存在 users table,直接在 user.rb 里写逻辑不就好了?

可以 仿照 devise 来做嘛

#6 楼 @jhjguxin devise 太高深了!

@zhaoguobin 对吼 但俺分开写之后就报错了 中间有些环节应该是出问题了 书上的例子全是把代码堆在 controller 里 =.=

既然可以写到 models 那直接在 helpers 文件夹下写 module 岂不是也可以?这两种方法有什么说道吗:)

代码放 github 上,我帮你看

@clc3123 嘿嘿嘿 偶然发现问题解决了 多谢帮助:)

业务 不要放在 controller 中 简单控制可以

需要 登录 后方可回复, 如果你还没有账号请 注册新账号