我正在尝试建立一个用户评论网站。 我需要将创建的评论的所有权交给另一个用户。 以下是我的代码
_form,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)
有什么办法可以取代
current_user
前置代码reviews.new(review_params)
这样看不对。
你的评论好像有两件事,是点名的。
reviewer
是他们的名字)user_reviewed
是他们的电子邮件,而 user_id
是他们的ID)。这是超级混乱的。(而且我真的不清楚什么是 被检 其实是吗?!!! 评论有 title
和a 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)