新手问题 Rails 帮我看看我这种写法有没有问题?

dume2007 · 2013年10月24日 · 最后由 zj0713001 回复于 2013年10月24日 · 3773 次阅读
def index
    obclass = GgClasslist.new
    obnews = GgNews.new
    obask = GgNewsAsk.new

    @class = obclass.all
    @ask_list = obask.get_ask_list 10
    @day_count = obnews.day_count
    @new = obnews.get_news_list false, false, "1=1", "n.id desc", "30", "0"    
  end

然后编辑器给了这个提示?

Controller action should call one model method other than an initial find or new less... (Ctrl+F1) This inspection warns if a controller action contains more than one model method call, after the initial .find or .new. It’s recommended that you implement all business logic inside the model class, and use a single method to access it. Inspired by "Ruby on Rails Code Quality Checklist" 不知道哪里需要改进?

这。。。。。。。是 java 的改行做 ruby 么???不 new 就难受的不行吧,,呵呵。。。

你可以说说呢要实现什么。我再看看,这么看,我感觉你操作 Rails/Ruby 代码的想法不对。。。。

#2 楼 @liwei78 功能很简单,就读取数据库, @class是读取所有栏目, @ask_list读取问答表的前 10 条数据 @day_count是统计今天更新的数据量 @new是获取前 30 条新闻数据 前面 3 个是 model,所有方法都写在 model 里~

这 java 转行的

为什么不直接定义成类方法?

...
@class = GgClasslist.all
...

这代码看起来都费劲 工具提示的就不重复了。命名不合理,无用代码太多,小括号咱就别省略了行吗。……

#7 楼 @chucai

def index
    obnews = GgNews.new
    obask = GgNewsAsk.new

    @class = GgClasslist.all
    @ask_list = obask.get_ask_list 10
    @day_count = obnews.day_count
    @new = obnews.get_news_list false, false, "1=1", "n.id desc", "30", "0"    
  end

我改进了,不过其它还要改么?编辑器一直有提示~但不是错误·

#9 楼 @dume2007 先改了再说吧 这属于重构的范畴,感觉可以参考 ActiveRecord 的 方法命名。 类似于取 List 的方法 应该定义成类方法,关于对指定记录的业务逻辑,定义成对象方法

供楼主参考。。。 看你的上下文,「栏目」用 column 或者 section 更合适:

def index 
    @columns = GgClasslist.all
    @ask_lists = GgNewsAsk.get_ask_list(10)
    @day_count = GgNews.day_count
    @news = GgNews.get_news_list(false, false, "1=1", "n.id desc", "30", "0"    )
  end
class GgNewsAsk < ActiveRecord::Base
  def self.get_ask_list(limit = 10)
    #do something
  end
end

#10 楼 @chucai

def index
    @class = GgClasslist.all
    @ask_list = GgNewsAsk.new.get_ask_list(10)
    @day_count = GgNews.new.day_count
    @new = GgNews.new.get_news_list(false, false, "1=1", "n.id desc", "30", "0")    
  end

我改成这样了,工具现在不提示了~ 写法是否符合?

#11 楼 @_samqiu 经测试,model 里的自定义方法还是要多个 new 的

一句话总结:亲,Rails 代码可不是这么写的。

如果只是完成数据库调用,那么,不用 new,只要使用数据库表对应的 model,再调用 Model 里的 public method,就可以了。具体参考 http://guides.rubyonrails.org/v3.2.13/getting_started.html 先走一遍“如何写 Rails 代码”。

java 是调用实例,才做事。Rails 不完全是的,可以这么来理解:

Rails 中的 Model 代表数据库表和它里面的全体数据,Model.new 代表一条记录。因为字段和属性绑定,所以,这个 new 之后的 Model instance,是要写到数据库的。

所以,该 Model 做的事情,比如 get_list,count 由 Model 来做,@new(不要用这个名字)赋值后 save,保存到数据库。

#13 楼 @dume2007 我没写过 Java,静态方法是这样写吗?

public class GgNewsAsk {
  public static AskList get_ask_list(){
     /*Get something*/
  }
}

Ruby 的静态方法就在前面加个 self.

看见代码我第一时间就想把帖子关了 要不是看见楼主的 头像

#15 楼 @_samqiu #14 楼 @liwei78 领教了,多谢哈!!!一段代码带出这么多问题,还是有收获的~

#11 楼 @_samqiu #14 楼 @liwei78 不过为什么编辑器还有提示呢?虽然没错误~

静态方法是使用公共内存空间的,就是说所有对象都可以直接引用,不需要创建对象再使用该方法。静态方法最大的特点就是,不用生成类的实例对象,直接可以用。 Java 中的静态方法中,在方法声明时前面要加 static 修饰符。 静态方法中不能直接调用实例方法.!! 静态方法和实例方法的区别主要体现在两个方面:

#15 楼 @_samqiu 上面是百度搜的。Rails 是数据库驱动的,世界观不同。

#18 楼 @dume2007 GgNews.find(....) 试试。。。而且你 Model 名称不该为复数。 具体的查询参考:http://guides.rubyonrails.org/v3.2.13/active_record_querying.html

#20 楼 @liwei78 这个方法我是用原生 sql 执行的,判断比较多,直接用 AR query,不好操作~

#21 楼 @dume2007 贴 sql 代码吧 小心 sql 注入 判断比较多我反而觉得 AR 更好用

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