Rails如何从当前url获取id

时间:2015-11-15 20:58:56

标签: ruby-on-rails ruby ruby-on-rails-4 active-record-query

我正在构建应用程序 - 简单的成绩簿并陷入一件事。我有用户,成绩和测试的模型文件,其中:

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

成绩表包含user_id,test_id和结果。

这个想法是这样的:来自用户#show页面的每个用户只能从某个主题获得他/她的成绩(我只做了两个)。老师可以看到每个创建的学生的成绩。事情就是这样:当我以教师(管理员)身份登录并从某个用户页面转到成绩页面时,我的网址会发生如下变化:

/user/7 - &gt; /grades/7?subject=History

对于用户的ID,一切都很清楚,但在我的数据库中,我没有ID = 7的成绩。所以问题是:

如何从成绩链接访问此ID“7”,将其与成绩表中的user_id进行比较,以仅显示此用户的成绩。尝试如下,但得到空表:

<% @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])这样的东西。你有什么想法?请帮忙!

1 个答案:

答案 0 :(得分:3)

我建议的第一件事就是在你的观点上尽可能少地使用逻辑。

话虽如此:如果您想获得特定用户的成绩,由于成绩与用户有关系,您应该可以直接致电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从网址获取主题的名称,并将其动态地包含在您的控制器查询中,但我建议将主题作为也是一个参数(/grades/7/history),而不是将其作为查询传递(/grades/7?subject=History)。