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

cor*_*tex 12 ruby ruby-on-rails

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

情况1

controller.rb ...

def index
  ...
  @group = params[:group]
  @team = params[:team]
  @org = params[:org]
  ...
end
Run Code Online (Sandbox Code Playgroud)

index.html.haml

= link_to @group, '#'
= link_to @team, '#'
= link_to @org, '#'
Run Code Online (Sandbox Code Playgroud)

案例2

controller.rb ...

def index
  ...

  ...
end
Run Code Online (Sandbox Code Playgroud)

index.html.haml

= link_to params[:group], '#'
= link_to params[:team], '#'
= link_to params[:org], '#'
Run Code Online (Sandbox Code Playgroud)

或者可能还有另一个选项,比如只传递一个Hash类型的实例变量...

谢谢!

tad*_*man 7

通常,最好将参数拆分为实例变量,尤其是在需要对它们进行清理时.使用params直接的视图内是有点杂乱,并且具有不必要捆扎视图到传入的参数的结构的效果.

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

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

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

例如:

@team = Team.find_by_slug(params[:team_id])
@org = @team.org
@group = @team.group
Run Code Online (Sandbox Code Playgroud)

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

  • 我正在按组、团队和组织过滤用户结果。当我按组过滤时,我在 params 中发送组 id (params[:group]),然后我也想按团队过滤(保留组过滤器),所以我将 params[:group] 发送到要发送的视图在下一个请求中使用 params[:team]。 (2认同)

Seb*_*ian 7

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

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

def group
    params[:group]
end
helper_method :group
Run Code Online (Sandbox Code Playgroud)

在视图中:

= link_to group, '#'
Run Code Online (Sandbox Code Playgroud)

以这种方式,该方法是惰性的,仅在使用时进行评估.

另外看看