Rails中如何向render传递多个参数?
解决方法
首先纠正你传递参数的写法:在review.html.erb里,给集合渲染传递额外参数时,需要用键值对的形式指定局部变量,而不是直接丢变量进去。
修改review.html.erb里的渲染代码:
<%= render @reviews, students: @students %>
或者用更完整的等价写法:
<%= render partial: 'review', collection: @reviews, locals: { students: @students } %>
接下来在_review.html.erb里,从传入的students集合中匹配当前review对应的学生:
<li> <p>Student: <%= students.find { |student| student.id == review.student_id }.name %></p> <p>Score: <%= review.score%></p> <p>Review: <%= review.review%></p> <p>Created at: <%= review.created_at%></p> </li>
额外优化建议
其实你没必要手动传@students,更高效简洁的做法是利用Rails模型关联:
- 在
Review模型中添加关联:
class Review < ApplicationRecord belongs_to :student end
- 在控制器对应的action里,预加载学生数据(避免N+1查询问题):
def index @reviews = Review.includes(:student).paginate(page: params[:page]) end
- 最后在
_review.html.erb里直接调用关联对象:
<p>Student: <%= review.student.name %></p>
这种方式既不用手动传参,还能优化数据库查询性能,代码也更符合Rails规范。
内容的提问来源于stack exchange,提问作者Luke He
相关产品推荐
相关产品推荐

