RoR - ActiveRecord :: RecordNotFound at / tour / show&无法找到没有使用' id' =创建游览的游览

时间:2016-07-11 07:12:25

标签: ruby-on-rails ruby-on-rails-4 activerecord devise

**已更新以匹配重新发送的评论** - 新问题被标记为找不到id = create - 框架没有创建具有特定ID的任何游览。

这个问题已经困扰了一段时间,并决定再次从头开始,看看我是否遗漏了什么。我是RoR框架的新手,它已经是一个很好的学习曲线。

项目游览网站,允许主持人发布游览 目标:分配游览'到主机(使用Devise Gem) 当前问题:我无法将ID分配给创建导览,也无法查看正在保存或创建的任何导览。

附件是我的文件快照,已根据以前的用户答案更新:

的routes.rb

Rails.application.routes.draw do

  devise_for :host
  # devise_for :hosts

  resources :host, only: [:show]
  resources :tour

  #Root
  root 'static_pages#home'

  #Tour
  get 'tour/index'
  get 'tour/new'
  get 'tour/create'
  #get 'tours/:id'
  patch 'tour/update'
  get 'tour/show'
  get 'tour/edit'
  get 'tour/delete'
  get 'tour/update'

  #Static Pages 

  get 'about' => 'static_pages#about'
  get 'contact' => 'static_pages#contact'

佣金路线

         Prefix Verb   URI Pattern                   Controller#Action
        new_host_session GET    /host/sign_in(.:format)       devise/sessions#new
            host_session POST   /host/sign_in(.:format)       devise/sessions#create
    destroy_host_session DELETE /host/sign_out(.:format)      devise/sessions#destroy
           host_password POST   /host/password(.:format)      devise/passwords#create
       new_host_password GET    /host/password/new(.:format)  devise/passwords#new
      edit_host_password GET    /host/password/edit(.:format) devise/passwords#edit
                         PATCH  /host/password(.:format)      devise/passwords#update
                         PUT    /host/password(.:format)      devise/passwords#update
cancel_host_registration GET    /host/cancel(.:format)        devise/registrations#cancel
       host_registration POST   /host(.:format)               devise/registrations#create
   new_host_registration GET    /host/sign_up(.:format)       devise/registrations#new
  edit_host_registration GET    /host/edit(.:format)          devise/registrations#edit
                         PATCH  /host(.:format)               devise/registrations#update
                         PUT    /host(.:format)               devise/registrations#update
                         DELETE /host(.:format)               devise/registrations#destroy
                    host GET    /host/:id(.:format)           host#show
              tour_index GET    /tour(.:format)               tour#index
                         POST   /tour(.:format)               tour#create
                new_tour GET    /tour/new(.:format)           tour#new
               edit_tour GET    /tour/:id/edit(.:format)      tour#edit
                    tour GET    /tour/:id(.:format)           tour#show
                         PATCH  /tour/:id(.:format)           tour#update
                         PUT    /tour/:id(.:format)           tour#update
                         DELETE /tour/:id(.:format)           tour#destroy
                    root GET    /                             static_pages#home
                         GET    /tour/index(.:format)         tour#index
                tour_new GET    /tour/new(.:format)           tour#new
             tour_create GET    /tour/create(.:format)        tour#create
             tour_update PATCH  /tour/update(.:format)        tour#update
               tour_show GET    /tour/show(.:format)          tour#show
               tour_edit GET    /tour/edit(.:format)          tour#edit
             tour_delete GET    /tour/delete(.:format)        tour#delete
                         GET    /tour/update(.:format)        tour#update
                   about GET    /about(.:format)              static_pages#about
                 contact GET    /contact(.:format)            static_pages#contact

tour_controller.rb

这是我在def show或创建id

时遇到的主要问题
       class TourController < ApplicationController
   #before_action :set_tour, only: [:show, :edit, :update, :create]
   before_action :authenticate_host!, except: [:create]
   before_action :host_session

   def index
        @tours = Tour.all
   end

   def show
        @tour = Tour.find(params[:id])
   end

   def new
        @tour = Tour.new
   end

    def create
     @tour = Tour.new(tour_params)
     @tour.host = current_host
     @tour.save
    end

   def edit
        @tour = Tour.find(params[:id])
   end

   def update
        @tour = Tour.find(params[:id])

   if @tour.update_attributes(tour_param)
      redirect_to :action => 'show', :id => @tour
   else
      render :action => 'edit'
   end
   end

   def delete
          Tour.find(params[:id]).destroy
   redirect_to :action => 'index'
   end

   def set_tour
      @tour = Tour.find_by_id(params[:id])
   end

private

   def tour_params
      #params.require(:tour_details).permit(:host_id) if params[:tour_details]
      params.require(:tour).permit(:host_id) if params[:tour]
   end
end

_form.html erb

用于创建游览的表单,虽然在我的数据库迁移中我使用字符串字段作为标题 - 但是当我使用f.string时,RoR会抛出此消息...所以我总是将其更改回f .text_field

未定义的方法`string&#39;为# 你的意思是?串

 <h1>Add new tour</h1>

<%= form_for @tour do |f| %>

  <div class="form-group">
  <%= f.label :title %>
  <%= f.text_field :title %>
  <%= f.label :description %>
  <%= f.text_field :description%>
  </div>

  <%= f.submit "Create" %>

<% end %>

<%= link_to 'Back', {:action => 'index'} %>

show.html.erb

这是我现在的基本设置,但是当我可以让ID使用游览时需要将其移动。

<h1>show tour details</h1>

<p>
  <strong>Title:</strong>
  <h4><%= @tour.title %></h4>
</p>

<%= link_to 'Back' %>

schema.rb

ActiveRecord::Schema.define(version: 20160711094000) do

  create_table "hosts", force: :cascade do |t|
    t.string   "email",                  default: "", null: false
    t.string   "encrypted_password",     default: "", null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,  null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  add_index "hosts", ["email"], name: "index_hosts_on_email", unique: true
  add_index "hosts", ["reset_password_token"], name: "index_hosts_on_reset_password_token", unique: true

  create_table "tours", force: :cascade do |t|
    t.string   "title"
    t.float    "price"
    t.integer  "tour_id"
    t.text     "description"
    t.datetime "created_at"
    t.integer  "host_id"
  end

end

/ tour / create

时出现新错误

ActiveRecord :: RecordNotFound at / tour / create 无法找到带有&#39; id&#39; =创建

的游览 来自tour_controller的

快照,从更好的错误突出显示

def show         @tour = Tour.find(params [:id])

{&#34; controller&#34; =&gt;&#34; tour&#34;,&#34; action&#34; =&gt;&#34; show&#34;,&#34; id&# 34; =&GT;&#34;创建&#34;}

实例变量 - @_routes nil

所以对一些基础知识。 - 主机登录(使用设计并提供为host.id) - 创建一个游览(现在基本只有一个标题和描述) - 在当前主机ID下为巡视分配了唯一ID。 - 创建具有唯一ID的游览

1 个答案:

答案 0 :(得分:0)

在您的路线文件中,您手动创建路线。而是使用Rails默认助手。所以在你的路线文件中你可以使用

resources :tours

它会自动为您添加必要的CRUD路线。然后创建表单的一部分并在其中传递实例变量。它适用于更新和创建。您的表单标题是

<%= form_for tour do |f| %>

您可以将表单部分称为

<%= render partial: 'form_partial_name' , locals: { tour: @tour } %>

对于处理主机,只需建立Host和Tour的关联。 在tour.rb

belongs_to :host

在host.rb

has_many :hosts

然后在创建操作中,您可以将其作为

def create
 @tour = Tour.new(tour_params)
 @tour.user = current_host
 @tour.save
end

随着协会的完整,您现在可以找到针对主持人的巡回演出并主持巡回演出。

@tour.host
@host.tours

由于您在每个方法中设置了实例var,因此无需添加此before_action过滤器

before_action :set_tour, only: [:show, :edit, :update, :create]