为啥不能在视图中使用它,因为它在控制器中使用?
Posted
技术标签:
【中文标题】为啥不能在视图中使用它,因为它在控制器中使用?【英文标题】:Why can't find be used in the view as it is used in the controller?为什么不能在视图中使用它,因为它在控制器中使用? 【发布时间】:2017-01-07 00:37:56 【问题描述】:我目前正在浏览 Michael Hartl 的 railstutorial.org,遇到了一个 Google/*** 似乎没有回答的问题:本教程让我们通过将 <%= @user.name %>, <%= @user.email %>
放入 show 中来在视图中显示用户信息.html.erb。在控制器中,它让我们定义了一个show
方法:@user = User.find(params[:id])
。
我明白为什么会这样,但我不明白为什么下面的代码不会产生相同的结果(我从控制器中删除了show
方法并尝试将所有代码放在视图中)。这些是我对 show.html.erb 的版本:
<%= @user.find(params[:id]).name %>, <%= @user.find(params[:id]).email %>
它返回“nil:NilClass 的未定义方法 `find'”。
【问题讨论】:
【参考方案1】:我相信你现在从其他答案和可能的教程中明白了你不应该在视图中使用这个逻辑来回答你的问题:
<%= @user.find(params[:id]).name %>
产生错误的原因
undefined method 'find' for nil:NilClass
是因为 @user
是您从控制器中的 show
方法中删除的实例变量。所以现在,@user
为零并且不存在。此外,当您要查询数据库时,您必须使用class
(型号)名称,即User
而不是@user
。
因此,虽然这样做是不好的做法,但如果你愿意,你可以这样做 <%= User.find(params[:id]).name %>
(只要它的 id 正确),这样就可以了。您的参数在视图中可用,因为它们也在控制器中。
最后,如果你打算使用show view,你不能完全删除show方法,你至少要有:
def show
end
为了让它工作。
【讨论】:
很好的回应,谢谢。是的,我知道它不应该出现在视图中,只是想知道为什么为了更好地理解 MVC 方式背后的逻辑。【参考方案2】:params 可能在视图中不可用,也不应该。
您的问题是您应该在控制器中进行数据准备的主要原因:捕捉数据的问题。这就是控制器存在的原因。
如果不是用于 Rails 端查询缓存,您的代码将对数据库发出两次请求,而不是一次。
在控制器中准备你的@user
并在视图中访问它。它将使测试和重构代码更容易,并大大提高可读性。
比较
<%= User.find(params[:id]).name %>, <%= User.find(params[:id]).email %>
VS.
<%= @user.name %>, <%= @user.email %>
【讨论】:
【参考方案3】:你真的不应该在视图中有很多逻辑,但我认为你正在寻找的代码是:
<%= User.find(params[:id]).name %>, <%= User.find(params[:id]).email %>
【讨论】:
以上是关于为啥不能在视图中使用它,因为它在控制器中使用?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我不能在可可中使用名为“title”的 IBOutlet?