新手问题 探讨一个关于细节上设计 view 和 controller 的新手问题

QueXuQ · 2012年10月23日 · 最后由 QueXuQ 回复于 2012年10月24日 · 2058 次阅读

问题如下: controller:

def index 
  @projects = Project.all
  @tip = 0
end

view:

- if @tip == 1
  p hello!

- @projects.each do |pro|
  p = pro.name
  if pro.name == 'x'
    @tip = 1

简单说,就是当 name == ‘x’的时候,显示`p hello!',但是必须在循环上面显示。 上面的代码显然是有问题的,如果根据我所想我会改成这样:

def index
  @projects = Project.all
  @tip = 0
  @projects.each do |pro|
    @tip = 1 if pro.name == 'x'
  end
end

这样就可以实现上面的效果,可是这里用了两次循环,我觉得不太好。因为我觉得可以只用一次循环就足够了。

请问,各位对于这样比较简单的问题,你们的设计思路是怎么样的呢?

- if @projects.any?{|project| project.name == 'x'}
  p hello!
匿名 #2 2012年10月23日

不太喜欢 haml,可读性太差了。。。很不习惯

匿名 #3 2012年10月23日

没太看懂你想做啥,要判断是否包含 name 是 x 的? def index 里那个 each,你可以 @projects.any?{|pro| pro.name=="x"} 返回 boolean

看你前面描述又说“就是当 name == ‘x’的时候,现实`p hello!',但是必须在循环上面显示。” 你不是在循环里显示吗?还是循环为了判断是否有 name == “x”?

首先 Project.all 不是循环,其次.each 一般在 view 中。为什么不在 view 中 p 'hello' if each_project.name == 'x'

#1 楼 @Rei 这个很简练! #3 楼 @help5305fff 我想表达的是如果 name 里面有 x,就显示p hello!。如果没有,就不显示。 #4 楼 @itsvoid p 'hello' if each_project.name == 'x'这个应该和@Rei写的是一样概念吧。

#5 楼 @QueXuQ slim 里面应该不能这么写

顺便

- @projects.each do |pro|
  p = pro.name
  if pro.name == 'x'
    @tip = 1

也是有问题的,正确的是

- @projects.each do |pro|
  p = pro.name
  - if pro.name == 'x' # 或者 - @tip = 1 if pro.name
    - @tip = 1

#6 楼 @Rei 非常感激,很热心。~^_^

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