Ruby on rails 未定义的方法'reviews#u path';对于

Ruby on rails 未定义的方法'reviews#u path';对于,ruby-on-rails,routes,Ruby On Rails,Routes,我正在建立一种方法,在这种方法中,用户可以查看其他用户,我正在使用它作为基础 视图/配置文件/显示 <%= link_to "Write a Review", new_user_review_path(@user) %> Routes.rb resources :users do resources :review, only: [:new, :create] end 嗯,也许我得做一个会员做什么 编辑,我在玩它,我想这是因为正在审查的模型没有在控制器中正确

我正在建立一种方法,在这种方法中,用户可以查看其他用户,我正在使用它作为基础

视图/配置文件/显示

    <%= link_to "Write a Review", new_user_review_path(@user) %>
Routes.rb

resources :users do 

   resources :review, only: [:new, :create] 

end
嗯,也许我得做一个会员做什么

编辑,我在玩它,我想这是因为正在审查的模型没有在控制器中正确设置

def set_receiver
  @review.receiver = User.find(params[:receiver_id])
end
添加这样的内容会导致“找不到资源”错误


既然是另一个用户,我该如何设置评论的接收者?

首先,您的命名完全是反向的,令人困惑。若你们的应用程序专注于创建用户评论
review.user
应该指向作为评论主题的用户,而不是作者

我会将模型设置为:

class Review < ApplicationRecord
  belongs_to :user # the subject
  belongs_to :author, class_name: 'User' # self explainatory
end
在REST中,资源是复数的(除非只有一个资源是罕见的情况)


确切的错误是什么?是否创建了审阅或创建失败?审阅未创建请也共享回溯跟踪…使用bang保存审阅,您将得到它正在为
回滚的验证错误。保存
主要问题是您正在调用
.save
,而没有实际检查记录是否已保存。您总是希望在save和update方法中有一个条件,用于检查记录是否已创建/更新并发送相应的响应。尝试使用
rails g scaffold
,因为它将向您展示如何创建传统的rails控制器。它看起来不错,但我在ReviewController中获得了ActionController::UnknownFormat#newActionController::UnknownFormat表示您以错误的格式发送请求。例如,您是否在表单中添加了
remote:true
?然后,您需要确保操作响应
js
。我已将remote:true添加到表单中,没有更改我已修复该问题,这是因为plurizationuninitialized constant Review::Author,odd,它不是在模型中声明的吗?作者是否需要在reviewParam中声明?
def set_receiver
  @review.receiver = User.find(params[:receiver_id])
end
class Review < ApplicationRecord
  belongs_to :user # the subject
  belongs_to :author, class_name: 'User' # self explainatory
end
resources :users do 
  resources :reviews, only: [:new, :create] 
end
class ReviewsController < ApplicationController
  before_action :authenticate_user!
  before_action :set_user, only: [:new, :create, :index]
  before_action :set_review, only: [:show, :edit, :update, :destroy]

  # GET /users/:user_id/reviews/new
  def new
    @review = @user.reviews.new
  end

  # POST /users/:user_id/reviews
  def create
    @review = @user.reviews.new(review_params) do |r|
      r.author = current_user
    end
    if @review.save
      redirect_to @user, success: 'Thank you for your review!'
    else
      render :new
    end
  end

  private

  def set_user
    @user = User.find(params[:user_id])
  end

  def set_review
    @review = @user.reviews.find(params[:id])
  end
end
<%= form_for([@user, @review]) do |f| %>
  <div class="field">
    <div id="star-rating"></div>
  </div>
  <div class="field">
    <%= f.label :comment %><br>
    <%= f.text_area :comment %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>