Rails 如何从当前 url 获取 ID
Rails how to get id from current url
我正在构建应用程序——简单的成绩簿,但遇到了一件事。我有用户、等级和测试的模型文件,其中:
class Grade < ActiveRecord::Base
belongs_to :user
belongs_to :test
end
class Test < ActiveRecord::Base
has_one :grade, dependent: :destroy
validates :topic, presence: true
end
class User < ActiveRecord::Base
has_one :profile, dependent: :destroy
has_many :grades, dependent: :destroy
end
成绩 table 包含 user_id、test_id 和结果。
想法是这样的:来自 user#show 页面的每个用户只能进入某个科目的 his/her 成绩(我只做了两个)。老师可以看到每个创建的学生的成绩。事情是这样的:当我以教师(管理员)身份登录并从某个用户页面转到成绩页面时,我的 URL 更改如下:
/user/7
-> /grades/7?subject=History
对于用户的 id,一切都很清楚,但在我的数据库中,我没有 id=7 的等级。所以问题是:
我如何从等级 link 访问这个 id ‘7’ 以将其与等级 table 中的 user_id 进行比较以仅显示该用户的等级。像下面这样尝试,但是空了 table:
<% @grades.each do |g| %>
<tr>
<% if Test.find(g.test_id).subject == 'History' && User.find(params[:id]) == g.user_id %>
<td><%= Test.find(g.test_id).topic %></td>
<td><%= Test.find(g.test_id).date %>
<td><%= g.result %></td>
<% end %>
</tr>
<% end %>
所以通常我会寻找类似 this_url(params[:id])
的东西。你有什么想法?请帮忙!
我要建议的第一件事是在你的观点中尽可能少的逻辑。
话虽这么说:如果你想获得特定用户的成绩,因为成绩与用户有关系,你应该可以直接调用user.grade
。
此外,您不需要在您的视图中执行 <%= Test.find(g.test_id).topic %>
,而不是调用 Test.find(g.test_id).topic
,您可以直接调用 g.test.topic
.
因此,要进行全面重构,您可以在控制器中包含以下内容:
def <the name of your controller action>
@user = User.find(params[:id])
@grades = @user.grades.where(subject: 'history')
end
然后在您看来:
<% @grades.each do |g| %>
<tr>
<td><%= g.test.topic %></td>
<td><%= g.test.date %>
<td><%= g.result %></td>
</tr>
<% end %>
一切都应该正常。
注意: 您可以 follow this post 从 URL 中获取主题名称并将其动态包含到您的控制器中查询,但我建议也将主题作为参数传递(/grades/7/history
),而不是将其作为查询传递(/grades/7?subject=History
)。
我正在构建应用程序——简单的成绩簿,但遇到了一件事。我有用户、等级和测试的模型文件,其中:
class Grade < ActiveRecord::Base
belongs_to :user
belongs_to :test
end
class Test < ActiveRecord::Base
has_one :grade, dependent: :destroy
validates :topic, presence: true
end
class User < ActiveRecord::Base
has_one :profile, dependent: :destroy
has_many :grades, dependent: :destroy
end
成绩 table 包含 user_id、test_id 和结果。
想法是这样的:来自 user#show 页面的每个用户只能进入某个科目的 his/her 成绩(我只做了两个)。老师可以看到每个创建的学生的成绩。事情是这样的:当我以教师(管理员)身份登录并从某个用户页面转到成绩页面时,我的 URL 更改如下:
/user/7
-> /grades/7?subject=History
对于用户的 id,一切都很清楚,但在我的数据库中,我没有 id=7 的等级。所以问题是:
我如何从等级 link 访问这个 id ‘7’ 以将其与等级 table 中的 user_id 进行比较以仅显示该用户的等级。像下面这样尝试,但是空了 table:
<% @grades.each do |g| %>
<tr>
<% if Test.find(g.test_id).subject == 'History' && User.find(params[:id]) == g.user_id %>
<td><%= Test.find(g.test_id).topic %></td>
<td><%= Test.find(g.test_id).date %>
<td><%= g.result %></td>
<% end %>
</tr>
<% end %>
所以通常我会寻找类似 this_url(params[:id])
的东西。你有什么想法?请帮忙!
我要建议的第一件事是在你的观点中尽可能少的逻辑。
话虽这么说:如果你想获得特定用户的成绩,因为成绩与用户有关系,你应该可以直接调用user.grade
。
此外,您不需要在您的视图中执行 <%= Test.find(g.test_id).topic %>
,而不是调用 Test.find(g.test_id).topic
,您可以直接调用 g.test.topic
.
因此,要进行全面重构,您可以在控制器中包含以下内容:
def <the name of your controller action>
@user = User.find(params[:id])
@grades = @user.grades.where(subject: 'history')
end
然后在您看来:
<% @grades.each do |g| %>
<tr>
<td><%= g.test.topic %></td>
<td><%= g.test.date %>
<td><%= g.result %></td>
</tr>
<% end %>
一切都应该正常。
注意: 您可以 follow this post 从 URL 中获取主题名称并将其动态包含到您的控制器中查询,但我建议也将主题作为参数传递(/grades/7/history
),而不是将其作为查询传递(/grades/7?subject=History
)。