我正在尝试制作一个用户评论网站。我需要将创建的评论的所有权授予另一个用户。这是我的代码
_表单,html.erb文件
<%= form_with(model: review, local: true) do |form| %>
<% if review.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(review.errors.count, "error") %> prohibited this review from being saved:</h2>
<ul>
<% review.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field-group">
<%= form.label :Review_Title %>
<%= form.select(:title, options_for_select([ ['Excellent Experience','Excellent Experience'], ['Great Experience','Great Experience'], ['Average Experience','Average Experience'], ['Poor Experience','Poor Experience'], ['Terrible Experience','Terrible Experience']])) %>
</div>
<div class="field-group">
<%= form.label :rating %>
<%= form.number_field :rating, min: 1, max:5, class: "form-control" %>
</div>
<div class="field-group">
<%= form.label :"Description"%>
<%= form.text_area :description, class: "form-control" %>
</div>
<div class="field-group">
<%= form.label :reviewer %>
<%= form.text_field :reviewer, class: "form-control", value:current_user.name, :disabled => true %>
</div>
<br>
<div class="field-group">
<%= form.label :"User Reviewing" %>
<%= form.select :user_reviewed, User. where("email <> ?", current_user.email).pluck(:email, :name), :prompt => "Select one", class: "form-control" %>
</div>
<br>
<div class="actions-group">
<%= form.submit "Submit", class: "btn btn-primary"%>
</div>
<% end %>
审查控制器的创建文件
def create
@review = current_user.reviews.new(review_params)
respond_to do |format|
if @review.save
format.html { redirect_to @review, notice: 'Review was successfully created.' }
format.json { render :show, status: :created, location: @review }
else
format.html { render :new }
format.json { render json: @review.errors, status: :unprocessable_entity }
end
end
结束
这段代码将文件的所有权授予current_user,我正试图获得另一个用户的信息。我想要的用户的电子邮件在表单中传递并保存在user_reviewed中。有没有办法在review.new(review_params(之前替换current_user代码?
# Table name: reviews
#
# id :bigint not null, primary key
# description :text
# rating :integer
# reviewer :string
# title :string
# user_reviewed :string
# created_at :datetime not null
# updated_at :datetime not null
# user_id :bigint
#
# Indexes
#
# index_reviews_on_user_id (user_id)
#
# Foreign Keys
#
# fk_rails_... (user_id => users.id)
有没有办法在
reviews.new(review_params)
之前替换current_user
代码
这不是正确的看待方式。
你的评论似乎有两件事,它们被命名为:
- 撰写评论的人。(
reviewer
是他们的名字( - 评论的"所有者"。(
user_reviewed
是他们的电子邮件,user_id
是他们的ID。(
这太令人困惑了。(我真的不清楚被审查的实际上是什么??!!评论有title
和description
,但它应该链接到什么吗??(这应该是关于一个用户审查另一个用户吗?我不明白。
在我看来,实际上应该在这个表中保留两个ID,而不是用户的电子邮件地址/名称。因此,它可以被命名为:
author_id
——撰写评论的用户owner_id
——拥有评论的用户
在视图中,而不是这样做:
<%= form.select :user_reviewed, User.where("email <> ?", current_user.email).pluck(:email, :name), :prompt => "Select one", class: "form-control" %>
你可以这样做:
<%= form.select :owner_id, User.where("id <> ?", current_user.id).pluck(:id, :name), :prompt => "Select one", class: "form-control" %>
然后在User
模型中,您可以清楚地区分:
user.reviews_written # joins on the author_id
user.reviews_owned # joins on the owner_id
在控制器中,您应该使用current_user
来实现它的实际含义:
@review = current_user.reviews_written.new(review_params)