【问题标题】:Passing from using '@user' to using 'user' in 'html.erb' files: how and why?从使用 '@user' 到在 'html.erb' 文件中使用 'user':如何以及为什么?
【发布时间】:2011-02-16 18:57:32
【问题描述】:

我正在使用 Ruby on Rails 3 和 I was advised (@user is a global variable, you can't 'localize' it. I would suggest passing local variables from your controller in the same way.) 在视图文件中使用 user 等变量,而不是 @user为什么要这样做?

所以,我正在考虑从使用@user 转为使用user。也就是说,(在html.erb文件中)从使用

@user.name

使用

user.name

此时例如在我的控制器的show方法中我有:

def show
  @user = Users.find(1)
  ...
end

我必须在控制器中进行哪些更改才能在视图中使用?

【问题讨论】:

标签: ruby-on-rails ruby variables views


【解决方案1】:

只有当从多个控制器的视图中调用相同的部分时,您才需要担心这一点。

有一个在其中使用 @user 的部分(可能在 users_controller 中设置)意味着当您从其他未设置 @users 的控制器(例如;accounts_controller)的视图中调用该部分时,您将得到一个错误。如果您仅在部分中引用局部变量,则可以根据需要从任何控制器中使用所描述的 :locals 散列设置它们。

【讨论】:

  • 你说的是真的,但是有办法解决这个问题\error吗?
  • 您是否共享来自两个独立控制器的视图的一部分?如果没有,就没有理由改变任何东西。如果你让我知道,我会发布一些代码:)
  • 是的。一个例子(有一些具体的)在这里:stackoverflow.com/questions/5020553/…(见更新)。如果您需要其他信息,请告诉我。
【解决方案2】:

这是没有意义的,只有 instance_variables 从控制器发送到视图。

Nikita Rybak 的回答没有错,他只是将视图中包含的实例变量 (@current_user) 传递给了具有不同名称的部分 (user):

 :locals => { :user => @current_user }

他总结得很好:

局部变量是局部的,所以你不需要@来引用它们。

确实,在使用分部时,您有两种选择:

  • 假设它可以访问实例变量(不建议这样做)

  • 将实例变量传递给局部名称,这是 Rails 的方式

【讨论】:

    【解决方案3】:

    看看这个Rails Best Practice。在渲染局部变量(那些以_ 开头的视图文件)时,使用局部变量是更可取的方式。那是因为您需要查看控制器的代码以了解实例变量。

    【讨论】:

      猜你喜欢
      • 2015-02-13
      • 2013-08-29
      • 2012-11-08
      • 2012-12-11
      • 2023-03-13
      • 2020-07-10
      • 1970-01-01
      • 1970-01-01
      • 2015-06-29
      相关资源
      最近更新 更多