最佳实践 - 在Ruby on Rails视图中传递实例变量或使用params?

时间:2013-04-04 23:51:48

标签: ruby-on-rails ruby

根据以下示例,最佳做法是什么?

案例1

controller.rb ...

def index
  ...
  @group = params[:group]
  @team = params[:team]
  @org = params[:org]
  ...
end

index.html.haml

= link_to @group, '#'
= link_to @team, '#'
= link_to @org, '#'

案例2

controller.rb ...

def index
  ...

  ...
end

index.html.haml

= link_to params[:group], '#'
= link_to params[:team], '#'
= link_to params[:org], '#'

或许还有另一种选择,比如只传递一个Hash类型的实例变量......

谢谢!

2 个答案:

答案 0 :(得分:7)

通常,最好将参数拆分为实例变量,尤其是在需要对其进行清理时。直接在视图中使用params有点乱,并且会不必要地将视图绑定到传入参数的结构。

控制器的工作是在传入参数和视图本身之间进行中间处理。它应该从一种格式转换为另一种格式,这样您就可以在不影响视图的情况下更改参数,也可以在不改变参数要求的情况下对视图进行更改。

传递参数而不对它们进行某种处理是不常见的。大多数情况下,传入参数用于从数据库中获取记录,或者以某种方式用于路由。

看到传入的三个参数然后在页面上使用字面并不是一个常见的用例。为什么要传递这些内容而不是传递对可用于确定其他内容的其中一个内容的引用?

例如:

@team = Team.find_by_slug(params[:team_id])
@org = @team.org
@group = @team.group

这就是构建大多数Rails应用程序的方式。

答案 1 :(得分:7)

如果你必须在这两个肯定#1之间进行选择,那么该视图不应该使用params哈希,因为它是一个混合的问题。控制器的作用是处理params散列并为视图准备一切。

我认为更好的做法是根本不使用实例变量,而只是在控制器中使用辅助方法:

def group
    params[:group]
end
helper_method :group

在视图中:

= link_to group, '#'

这种方法很懒惰,只有在使用时才会被评估。

另外看看