评论已保存到数据库,但显示不正确

时间:2019-11-24 00:08:24

标签: ruby-on-rails

我有一个Review模型,该模型既属于User又属于Profile。通过评论控制器中的创建动作,可以创建评论并将其保存到数据库中。

class ReviewsController < ApplicationController
  before_action :set_profile
  before_action :set_review, only: :new

  def new
    @review = Review.new
  end

def create
    @profile = Profile.find(params[:profile_id])
    @review = @profile.reviews.build(review_params)
    @review.user_id = current_user.id

    if @review.save
        redirect_to user_profile_path(current_user, @profile)
    else
        redirect_to user_profile_path(current_user, @profile), notice: "Didn't save your review"
    end
end

  private

  def review_params
    params.fetch(:review, {}).permit(:rating, :content)
  end

def set_profile
    @profile = Profile.find(params[:profile_id])
  end

  def set_review
   @review = Review.find(params[:id])
  end

end

如果我使用控制台进行检查,则Review.last实际上会显示带有所有关联的最后一个Review。

#<Review id: 10, rating: 5, content: "Test review", user_id: 3, profile_id: 1, created_at: "2019-11-23 23:50:57", updated_at: "2019-11-23 23:50:57">

所以,问题可能出在我的Profile#show.erb.html中。现在,评论位看起来像这样:

<% @reviews.each do |review| %>
    <%= @review.content %> wrote <small> <%= time_ago_in_words(review.created_at) %> ago </small>
    <p>
        <%= @review.content %>
    </p>
<% end %>

我得到的是:

wrote less than a minute ago

...没有任何内容。

所以,我再次猜到,它无法访问参数?那可能是这一行吗?

params.fetch(:review, {}).permit(:rating, :content)

但是之前,正如我在下面的代码中所看到的,它甚至没有保存到DB。

params.permit(:rating, :content)

此外,无法访问存储在User中的信息。理想情况下应该是这样

<% @reviews.each do |review| %>
    <%= @review.user.first_name.last_name %> wrote <small> <%= time_ago_in_words(review.created_at) %> ago </small>
    <p>
        <%= @review.content %>
    </p>
<% end %>

但是,当我这样做时,我会得到一个错误

undefined method `first_name'

我知道,

@review.user.first_name.last_name

可能不是显示用户的名字和姓氏的正确方法。理想情况下应该是

John Smith wrote 42 minutes ago : This is a test review

1 个答案:

答案 0 :(得分:2)

您有一些错误:

该块内的变量为review,而不是@review

<% @reviews.each do |review| %>
    <%= review ... %> wrote <small>
<% end %>

此外,除非您在String类上定义了first_name.last_name,否则last_name将引发NoMethodError。

请尝试:

<%= review.user.first_name %> <%= review.user.last_name %>