我有一个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
答案 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 %>