如何在视图中显示关联模型的属性?

时间:2015-07-03 00:35:11

标签: ruby-on-rails ruby-on-rails-4 activerecord

我有两个型号。用户和反馈

class User < ActiveRecord::Base
  has_one :feedback
  attr_accessible :email,user_role,.......
end 

class Feedback < ActiveRecord::Base
  belongs_to :user
  attr_accessible :suggest_status, :support_status, :goal_status, :problem, :suggestions
end

我正在尝试向管理员显示所有反馈。

我的反馈控制器看起来像这样

class FeedbacksController < ApplicationController
  def index
    @feedbacks = Feedback.all
  end 

  def new
    @feedback = Feedback.new
  end

  def create
    @user = current_user
    @feedback = Feedback.new(params[:feedback])
    @user.feedback = @feedback

    if @feedback.save 
      flash[:notice] = "feedback submitted successfully!"
      redirect_to @user
    else 
      flash.now[:warning] = "Error submitting feedback."
      render :new
    end
  end
end

现在我想显示与每个反馈相关联的用户的电子邮件。我能够显示user_id,但我不确定如何显示用户模型的电子邮件。

我的index.html.haml反馈如下所示

= stylesheet_link_tag 'all' 
%h1 All Feedbacks
%table#feedbacks
  %thead
    %tr
      %th Feedback Number
      %th Goals
      %th Suggest
      %th Support
      %th User ID

  %tbody
  - @feedbacks.each do |feedback| 
    %tr
      %td= feedback.id
      %td= feedback.goal_status
      %td= feedback.suggest_status
      %td= feedback.support_status
      %td= feedback.user_id

1 个答案:

答案 0 :(得分:2)

问题在于,在创建反馈时,您需要将用户分配给反馈,因为它是您要保存的反馈。实际上,您以其他方式执行此操作,将反馈分配给用户,但不保存用户。所以不要这样:

@user.feedback = @feedback

这样做:

@feedback.user = @user

您可能还需要考虑在反馈模型上添加验证,以禁止在没有用户的情况下保存反馈,如下所示:

validates_presence_of :user

一旦设置正确,那么您的关联应该正常工作。 belongs_to :user允许您直接引用关联,如下所示:

%td= feedback.user.email

另外,为了提高效率,您应该在加载反馈时急切加载用户:

@feedbacks = Feedback.includes(:user).all

执行此操作只会执行两个查询 - 一个用于获取所有反馈,另一个用于获取所有用户。如果您不急于加载,那么您将获得大量查询 - 一个用于获取所有反馈,但随后会有更多查询,每个用户一个查询。