ruby-on-rails 关联两个模型后缺少路径帮助器

beq87vna  于 2023-02-10  发布在  Ruby
关注(0)|答案(1)|浏览(96)
    • 背景**

我正在学习一门过时的Ruby初学者课程,但是遇到了一些问题。在这门课程中,我正在构建一个类似于Yelp的Ruby on rails应用程序,它是用来列出和评论餐馆的。目前,我正在将评论链接到餐馆。我的Ruby版本是:ruby 3.0.0p0(2020年12月25日修订版本95aff21468)[x86_64-darwin22]我的rails版本是:Rails网站7.0.4.2

    • 步骤**

我通过执行以下步骤将点评与餐厅联系起来:

  • 运行rails generate migration AddRestaurantIDToReviews restaurant_id:integer
  • 运行rake db:migrate
  • belongs_to :restaurant添加到reviews.rb
  • has_many :reviews添加到restaurants.rb
  • 检查rails routes
  • 调整后的routes.rb文件
  • 调整后reviews_form.html.erb
  • 调整后的review_controller.rb文件
  • 操作前set_restaurantset_restaurant
  • restaurant_id添加@review语句(第...行)
  • 已删除指向旧URL的链接
  • 重新启动服务器
    • 错误信息**

这导致了以下错误:未定义#ActionView::Base:0x0000000025800的方法"review_path",这是由以下代码行触发的:〈%=带(型号:[@餐厅,@评论],当地:真)做|形式|%〉(来自relevents_form. html. erb文件).在this thread中解释了一个类似的问题,但我仍然无法理解它.
有人能帮我吗?如果你需要更多的信息,请让我知道!

    • 评论. rb**
class Review < ApplicationRecord
    belongs_to :user
    belongs_to :restaurant
end
    • 餐厅. rb**
class Restaurant < ApplicationRecord
    mount_uploader :image, ImageUploader
    has_many :reviews
end
    • 路线. rb**
Rails.application.routes.draw do
  devise_for :users
  resources :restaurants do 
    resources :reviews, except: [:show, :index] 
  end
  get 'pages/about'
  get 'pages/contact'
  root 'restaurants#index'
  # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html

  # Defines the root path route ("/")
  # root "articles#index"
end

**Routes**
` Prefix Verb   URI Pattern                                                                                       Controller#Action
                        new_user_session GET    /users/sign_in(.:format)                                                                          devise/sessions#new
                            user_session POST   /users/sign_in(.:format)                                                                          devise/sessions#create
                    destroy_user_session DELETE /users/sign_out(.:format)                                                                         devise/sessions#destroy
                       new_user_password GET    /users/password/new(.:format)                                                                     devise/passwords#new
                      edit_user_password GET    /users/password/edit(.:format)                                                                    devise/passwords#edit
                           user_password PATCH  /users/password(.:format)                                                                         devise/passwords#update
                                         PUT    /users/password(.:format)                                                                         devise/passwords#update
                                         POST   /users/password(.:format)                                                                         devise/passwords#create
                cancel_user_registration GET    /users/cancel(.:format)                                                                           devise/registrations#cancel
                   new_user_registration GET    /users/sign_up(.:format)                                                                          devise/registrations#new
                  edit_user_registration GET    /users/edit(.:format)                                                                             devise/registrations#edit
                       user_registration PATCH  /users(.:format)                                                                                  devise/registrations#update
                                         PUT    /users(.:format)                                                                                  devise/registrations#update
                                         DELETE /users(.:format)                                                                                  devise/registrations#destroy
                                         POST   /users(.:format)                                                                                  devise/registrations#create
                      restaurant_reviews POST   /restaurants/:restaurant_id/reviews(.:format)                                                     reviews#create
                   new_restaurant_review GET    /restaurants/:restaurant_id/reviews/new(.:format)                                                 reviews#new
                  edit_restaurant_review GET    /restaurants/:restaurant_id/reviews/:id/edit(.:format)                                            reviews#edit
                       restaurant_review PATCH  /restaurants/:restaurant_id/reviews/:id(.:format)                                                 reviews#update
                                         PUT    /restaurants/:restaurant_id/reviews/:id(.:format)                                                 reviews#update
                                         DELETE /restaurants/:restaurant_id/reviews/:id(.:format)                                                 reviews#destroy
                             restaurants GET    /restaurants(.:format)                                                                            restaurants#index
                                         POST   /restaurants(.:format)                                                                            restaurants#create
                          new_restaurant GET    /restaurants/new(.:format)                                                                        restaurants#new
                         edit_restaurant GET    /restaurants/:id/edit(.:format)                                                                   restaurants#edit
                              restaurant GET    /restaurants/:id(.:format)                                                                        restaurants#show
                                         PATCH  /restaurants/:id(.:format)                                                                        restaurants#update
                                         PUT    /restaurants/:id(.:format)                                                                        restaurants#update
                                         DELETE /restaurants/:id(.:format)                                                                        restaurants#destroy
                             pages_about GET    /pages/about(.:format)                                                                            pages#about
                           pages_contact GET    /pages/contact(.:format)                                                                          pages#contact
                                    root GET    /                                                                                                 restaurants#index
        turbo_recede_historical_location GET    /recede_historical_location(.:format)                                                             turbo/native/navigation#recede
        turbo_resume_historical_location GET    /resume_historical_location(.:format)                                                             turbo/native/navigation#resume
       turbo_refresh_historical_location GET    /refresh_historical_location(.:format)                                                            turbo/native/navigation#refresh
           rails_postmark_inbound_emails POST   /rails/action_mailbox/postmark/inbound_emails(.:format)                                           action_mailbox/ingresses/postmark/inbound_emails#create
              rails_relay_inbound_emails POST   /rails/action_mailbox/relay/inbound_emails(.:format)                                              action_mailbox/ingresses/relay/inbound_emails#create
           rails_sendgrid_inbound_emails POST   /rails/action_mailbox/sendgrid/inbound_emails(.:format)                                           action_mailbox/ingresses/sendgrid/inbound_emails#create
     rails_mandrill_inbound_health_check GET    /rails/action_mailbox/mandrill/inbound_emails(.:format)                                           action_mailbox/ingresses/mandrill/inbound_emails#health_check
           rails_mandrill_inbound_emails POST   /rails/action_mailbox/mandrill/inbound_emails(.:format)                                           action_mailbox/ingresses/mandrill/inbound_emails#create
            rails_mailgun_inbound_emails POST   /rails/action_mailbox/mailgun/inbound_emails/mime(.:format)                                       action_mailbox/ingresses/mailgun/inbound_emails#create
          rails_conductor_inbound_emails GET    /rails/conductor/action_mailbox/inbound_emails(.:format)                                          rails/conductor/action_mailbox/inbound_emails#index
                                         POST   /rails/conductor/action_mailbox/inbound_emails(.:format)                                          rails/conductor/action_mailbox/inbound_emails#create
       new_rails_conductor_inbound_email GET    /rails/conductor/action_mailbox/inbound_emails/new(.:format)                                      rails/conductor/action_mailbox/inbound_emails#new
      edit_rails_conductor_inbound_email GET    /rails/conductor/action_mailbox/inbound_emails/:id/edit(.:format)                                 rails/conductor/action_mailbox/inbound_emails#edit
           rails_conductor_inbound_email GET    /rails/conductor/action_mailbox/inbound_emails/:id(.:format)                                      rails/conductor/action_mailbox/inbound_emails#show
                                         PATCH  /rails/conductor/action_mailbox/inbound_emails/:id(.:format)                                      rails/conductor/action_mailbox/inbound_emails#update
                                         PUT    /rails/conductor/action_mailbox/inbound_emails/:id(.:format)                                      rails/conductor/action_mailbox/inbound_emails#update
                                         DELETE /rails/conductor/action_mailbox/inbound_emails/:id(.:format)                                      rails/conductor/action_mailbox/inbound_emails#destroy
new_rails_conductor_inbound_email_source GET    /rails/conductor/action_mailbox/inbound_emails/sources/new(.:format)                              rails/conductor/action_mailbox/inbound_emails/sources#new
   rails_conductor_inbound_email_sources POST   /rails/conductor/action_mailbox/inbound_emails/sources(.:format)                                  rails/conductor/action_mailbox/inbound_emails/sources#create
   rails_conductor_inbound_email_reroute POST   /rails/conductor/action_mailbox/:inbound_email_id/reroute(.:format)                               rails/conductor/action_mailbox/reroutes#create
rails_conductor_inbound_email_incinerate POST   /rails/conductor/action_mailbox/:inbound_email_id/incinerate(.:format)                            rails/conductor/action_mailbox/incinerates#create
                      rails_service_blob GET    /rails/active_storage/blobs/redirect/:signed_id/*filename(.:format)                               active_storage/blobs/redirect#show
                rails_service_blob_proxy GET    /rails/active_storage/blobs/proxy/:signed_id/*filename(.:format)                                  active_storage/blobs/proxy#show
                                         GET    /rails/active_storage/blobs/:signed_id/*filename(.:format)                                        active_storage/blobs/redirect#show
               rails_blob_representation GET    /rails/active_storage/representations/redirect/:signed_blob_id/:variation_key/*filename(.:format) active_storage/representations/redirect#show
         rails_blob_representation_proxy GET    /rails/active_storage/representations/proxy/:signed_blob_id/:variation_key/*filename(.:format)    active_storage/representations/proxy#show
                                         GET    /rails/active_storage/representations/:signed_blob_id/:variation_key/*filename(.:format)          active_storage/representations/redirect#show
                      rails_disk_service GET    /rails/active_storage/disk/:encoded_key/*filename(.:format)                                       active_storage/disk#show
               update_rails_disk_service PUT    /rails/active_storage/disk/:encoded_token(.:format)                                               active_storage/disk#update
                    rails_direct_uploads POST   /rails/active_storage/direct_uploads(.:format)                                                    active_storage/direct_uploads#create`
    • 审核表单. html. erb**
<%= form_with(model: [@resturant, @review], local: true) do |form| %>
  <% if review.errors.any? %>
    <div style="color: red">
      <h2><%= pluralize(review.errors.count, "error") %> prohibited this review from being saved:</h2>

      <ul>
        <% review.errors.each do |error| %>
          <li><%= error.full_message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <div class="form-group">
    <%= form.label :rating, style: "display: block" %>
    <%= form.number_field :rating, class: "form-control" %>
  </div>

  <div class="form-group">
    <%= form.label :comment, style: "display: block" %>
    <%= form.text_area :comment, class: "form-control" %>
  </div>

  <div>
    <%= form.submit class: "btn btn-primary" %>
  </div>
<% end %>
    • 评论_控制器. rb**
class ReviewsController < ApplicationController
  before_action :set_review, only: %i[ edit update destroy ]
  before_action :set_restaurant
  before_action :authenticate_user!

  # GET /reviews/new
  def new
    @review = Review.new
  end

  # GET /reviews/1/edit
  def edit
  end

  # POST /reviews or /reviews.json
  def create
    @review = Review.new(review_params)
    @review.user_id = current_user.id
    @review.restaurant_id = @restaurant.id

    respond_to do |format|
      if @review.save
        format.html { redirect_to root_path, notice: "Review was successfully created." }
        format.json { render :show, status: :created, location: @review }
      else
        format.html { render :new, status: :unprocessable_entity }
        format.json { render json: @review.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /reviews/1 or /reviews/1.json
  def update
    respond_to do |format|
      if @review.update(review_params)
        format.html { redirect_to review_url(@review), notice: "Review was successfully updated." }
        format.json { render :show, status: :ok, location: @review }
      else
        format.html { render :edit, status: :unprocessable_entity }
        format.json { render json: @review.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /reviews/1 or /reviews/1.json
  def destroy
    @review.destroy

    respond_to do |format|
      format.html { redirect_to reviews_url, notice: "Review was successfully destroyed." }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_review
      @review = Review.find(params[:id])
    end

    def set_restaurant
      @restaurant = Restaurant.find(params[:restaurant_id])
    end

    # Only allow a list of trusted parameters through.
    def review_params
      params.require(:review).permit(:rating, :comment)
    end
end
piok6c0g

piok6c0g1#

url: restaurant_reviews_path添加到form_with中产生了不同。

<%= form_with(model: @review, url: restaurant_reviews_path, local: true) do |form| %>

相关问题