为什么在控制器中使用它时无法在视图中使用?

时间:2017-01-07 00:37:57

标签: ruby-on-rails model-view-controller

我目前正在阅读Michael Hartl的railstutorial.org,并且遇到了Google / Stackoverflow似乎没有回答的问题:该教程让我们通过放置<%= @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返回“未定义的方法`find”:NilClass“。

3 个答案:

答案 0 :(得分:0)

你真的不应该在视图中有很多逻辑,但我认为你正在寻找的代码是:

<%= User.find(params[:id]).name %>, <%= User.find(params[:id]).email %>

答案 1 :(得分:0)

params可能在视图中不可用,它不应该。

您的问题是您应该在控制器中进行数据准备的主要原因:捕获数据问题。这就是控制器存在的原因。

如果它不适用于rails端查询缓存,那么您的代码将向数据库发出两个请求而不是一个请求。

在控制器中准备@user并在视图中访问它。它将使代码的测试和重构更容易,并大大提高可读性。

比较

<%= User.find(params[:id]).name %>, <%= User.find(params[:id]).email %>

VS

<%= @user.name %>, <%= @user.email %>

答案 2 :(得分:0)

我确定你现在从其他答案以及可能的教程中理解你不应该在视图中使用这个逻辑,但是,回答你的问题:

int maxPath(vector<vector<int> > Grid, vector<pair<int, int>> &path) { return getMaxPath(Grid, 0, 0, path); } int main() { vector<vector<int> > mat{ { 5,0,8,12 },{ 11,16,9,13 },{ 10,2,15,300 },{ 3,14,18,19 } }; vector<pair<int, int>>path; int result = maxPath(mat, path); cout << result << endl; for (auto it = path.begin(); it != path.end(); it++) std::cout << "(" << it->first << ", " << it->second << ")"; system("pause"); return 0; } 生成错误的原因 <%= @user.find(params[:id]).name %>是因为undefined method 'find' for nil:NilClass是一个实例变量,您从控制器中的@user方法中删除了该变量。现在,show是零并且不存在。此外,当您要查询数据库时,必须使用@user(模型)名称class而不是User

所以尽管这样做是不好的做法,但是如果你愿意的话,你可以做@user(只要它是一个正确的id),那就行了。您的参数在视图中也可用,因为它们也在控制器中。

最后,如果您打算使用show视图,则无法完全删除show方法,您必须至少拥有:

<%= User.find(params[:id]).name %> 为了它的工作。