如何从列表中的学生那里获取 ID,并在另一页上显示学生的信息?Ruby on Rails



我正在创建一个学生列表,当我单击一个超链接时,我想显示一个带有我单击的学生信息的表。

我正在使用两页, index.html.erb show.html.erb 。在索引页面中,我想显示列表和显示页面,我想仅显示一个学生的信息。我是Ruby在Rails上的新手,但我想变得更好。感谢您的所有回复。

index.html.erb

<h1> Welcome </h1>
   <%= link_to "Display Table", students_show_path %>
   <%= link_to "Form", students_new_path %>
<ol> Students
    <% @student.each do |s| %>
       <!--<li><%= link_to s.FirstName, students_show_path(@student.students_id), method: :post %> </li> -->
       <li><%= link_to s.FirstName, :action => "show", :id => Student.id %> </li>
   <% end %>
</ol>

这是我的show.html.erb

表的页面

<% @student.each do |s| %>
<tr>
    <td> <%= s.FirstName %> </td>
    <td> <%= s.LastName %> </td>
    <td> <%= s.NickName %> </td>
    <td> <%= s.EmailAddress %> </td>
    <td> <%= s.Birthday %> </td>
    <td> <%= s.MedicalNotes %> </td>
    <td> <%= s.Grade %> </td>
    <td> <%= s.School %> </td>
    <td> <%= s.Gender %> </td>
</tr>

这是我的Routes.rb

Rails.application.routes.draw do
  root 'students#index'
  get 'students/index'
  get 'students/show'
  get 'students/new'
  get 'students/update'
  get 'students/create'
  get 'students/edit'
  get 'students/destroy'
  get '/signup', to: 'students#new'
  post '/signup', to: 'students#create'
  post '/index', to: 'students#index'
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
resources :students
  # generates:
  #   get "/students" -- index on your controller
  #   get "/students/:id" -- show on your controller
  #   get "/students/new" -- new method on your controller
  #   post "/students" -- create on your controller
  #   get "/students/:id/edit" -- edit method on your controller
  #   put "/students/:id" -- update on your controller
  #   patch "/students/:id" -- update on your controller
  #   delete "/students/:id" -- destroy on your controller
end

这是我的susidess_controller

class StudentsController < ApplicationController
  def index
    @student = Student.all
  end
  def show
    id = params[:id]
    @student = Student.where("Student id = ?" , "#{id}")
  end
  def new
    @student = Student.new
  end
  def update
  end
  def create
    @student = Student.new(student_params)
    if @student.save
      redirect_to students_show_path
    else
      render 'new'
  end
end
  def edit
  end
  def destroy
  end
  private
    def student_params
       params.permit(:FirstName, :LastName, :NickName, :EmailAddress, :Birthday, :MedicalNotes, :Grade, :School, :Gender)
    end
end

for index.html.erb文件,尝试将link_to link_to helpers更新为:

<%= link_to s, s.FirstName %>

如果使用具有显示方法的链接帮助者,您不需要通过完整的路由 ID,Rails将为您自动链接。

删除所有get 'students/...路由,只需离开resources: :students即可。您在此行上方指定的路线是多余的。

您的show方法在控制器中也可以稍微清理:

def show
  @student = Student.find(params[:id])
end

最后,我相信您的create方法,您可以仅使用资源重定向:

def create
  @student = Student.new(student_params)
  if @student.save
    redirect_to @student
  else
    render 'new'
end

第一件事:

命名属性,方法和变量的Ruby方法是使用Snake_case。例如,s.FirstName应为s.first_name。在Ruby中,如果名称像FirstName一样大写,则实际上是一个常数。这种样式称为骆驼,这是在Ruby中命名类的常规方式,例如StudentsController

routes.rb

如果您使用
resources :students

您可以通过在命令行上运行rake routes或在浏览器中访问http://localhost:3000/rails/info/routes来查看所有这些路由。您可以在文档中了解有关路由的更多信息:http://guides.rubyonrails.org/Routing.html#inspecting-and-and-testing-routes

然后,您可以使用Rails link_to辅助方法:

<%= link_to s.first_name, s %>

和Rails将为您找出对象的id。或者如果您想更加明确:

<%= link_to s.first_name, student_path(s.id) %>

以及您想要的StudentsControllershow操作:

def show
  @student = Student.find(params[:id])
end

这将根据:id参数在数据库中查找学生记录的url for Student Show页面

我注意到有关您的代码的两件事

1(

get 'students/show'

要能够检索用户,您需要一个用户ID,一个唯一的标识符。因此,您的表演路线应包含一个ID。铁轨方式是这样的

get 'students/:id'

我只是在这里访问,因为如果您在查询字符串中使用参数('students/show?id=something'(

调用您的路线可以工作

无论如何,您正在定义不同行中的每条路线。事实证明,您只需线

就可以定义所有这些
resources :students

2(

在您的节目动作中,您只需要一个用户。而且您有一个ID,这是唯一的,因此您可以使用它直接检索您的用户

def show
  @student = Student.find(params[:id])
end

您使用的是where,这是为了检索与您的病情相匹配的所有用户(也许您想检索每个名称为" John"的用户(。因此,事实证明,您的@user不包含一个用户,而是您的用户处于关系中。那是因为where

最新更新