![](/img/trans.png)
[英]“undefined method `model_name' for…” error when using nested resources and simple_form, ruby on rails
[英]Simple_form nested resources: undefined method
我是 RoR 的新手,我在使用帶有嵌套資源的 simple_form 時遇到問題。
我有兩個模型:面試和實踐。 面試有_許多實踐和實踐屬於面試。
嘗試使用 simple_form 在 interview_id 中創建新實踐時,我遇到 Action Controller 錯誤(#<#Class:0x00007fda24ed79d8:0x00007fda24ed5fe8> 的未定義方法 `practices_path'),即。 在這條路線上:/interviews/:interview_id/practices/new)
誰能幫助確定我做錯了什么? 非常感謝你。
控制器
class PracticesController < ApplicationController
def index
@practices = Practice.all
end
def new
@practice = Practice.new
end
def create
@interview = Interview.find(params[:interview_id])
@practice = Practice.new(practice_params)
@practice.interview = @interview
if @practice.save
redirect_to new_interview_practice_path(@interview)
else
render 'new'
end
end
# def destroy
# @interview = Interview.find(params[:id])
# @question.interview = @interview
# @question.destroy
# redirect_to interview_questions_path(@interview)
private
def practice_params
params.require(:practice).permit(:question, :type, :title)
end
end
class InterviewsController < ApplicationController
def index
@interviews = Interview.all
end
def new
@interview = Interview.new
end
def create
@interview = Interview.new(interview_params)
@interview.user = current_user
if @interview.save
redirect_to interview_path(@interview)
end
end
def show
@interview = Interview.find(params[:id])
@question = Question.new
end
def destroy
@interview = Interview.find(params[:id])
@interview.destroy
redirect_to interviews_path
end
private
def interview_params
params.require(:interview).permit(:company, :industry, :photo)
end
end
楷模
class Interview < ApplicationRecord
belongs_to :user
has_many :videos, dependent: :destroy
has_many :questions, dependent: :destroy
has_many :practices, dependent: :destroy
validates :company, :industry, presence: true
has_one_attached :photo
def days_remaining
-(Date.today - self.final_date.to_date).to_i if self.final_date
end
include PgSearch::Model
pg_search_scope :search_by_name_and_date,
against: [:name, :open_date, :final_date, :company],
using: {
tsearch: { prefix: true }
}
end
class Practice < ApplicationRecord
belongs_to :interview
has_many :questions, through: :interviews
end
看法
<br>
<div class="text-center">
<h3>Lets create a new practice interview!</h3>
</div>
<div class="form-container">
<%= simple_form_for [@interview, @practice] do |f| %>
<div class="flex-container2">
<div class="form-style-5">
<legend><span class="number">1</span> Job Info</legend>
<%= f.input :title, placeholder: "give it a name"%>
<%= f.input :type, placeholder: "Competency"%>
<%= f.input :question, placeholder: "add here" %>
</div>
</div>
<div class="row d-flex justify-content-center mb-5">
<div class="col-md-7">
<%= f.submit class: "btn btn-primary"%>
</div>
</div>
<% end %>
</div>
路線
Rails.application.routes.draw do
devise_for :users
root to: 'pages#home'
get 'dashboard', to: 'users#dashboard'
get 'calendar', to: 'pages#calendar'
get 'video', to: 'pages#video'
get 'settings', to: 'pages#settings'
post 'sendsms', to: 'videos#send_sms'
resources :interviews, only: [:index, :new, :create, :show, :destroy] do
resources :questions, only: [:index, :new, :create, :show]
resources :practices, only: [:index, :new, :create, :show, :destroy]
resources :videos, only: [:index, :new, :create, :show] do
resources :reviews, only: [:new, :create]
end
end
resources :candidates, only: [:create, :new, :show]
resources :searches
get 'thank_you', to: 'videos#thank_you'
# For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end
架構
create_table "interviews", force: :cascade do |t|
t.datetime "open_date"
t.datetime "final_date"
t.bigint "user_id", null: false
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.string "name"
t.string "company"
t.string "industry"
t.index ["user_id"], name: "index_interviews_on_user_id"
end
create_table "practices", force: :cascade do |t|
t.string "title"
t.string "type"
t.text "question"
t.bigint "interview_id", null: false
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.index ["interview_id"], name: "index_practices_on_interview_id"
end
奇怪的
Action Controller error (undefined method `practices_path' for #<#Class:0x00007fda24ed79d8:0x00007fda24ed5fe8>)
錯誤只是意味着 Rails 正在嘗試獲取[@interview, @practice]
的路徑(您在視圖中使用)但 @interview 為空或 nil,因此創建記錄的默認路徑(在本例中為 @ practice) 將是practices_path
(表單將是 /practices 的帖子)。
你想要的是simple_form_for
使用interviews_practices_path
它將轉換為 /interviews/:interview_id/practices。
在您的PracticesController
操作new
中,您還需要初始化一個新的@interview
變量,因為您在視圖中使用它。
由於您的練習Z20F35E630DAF4DBFA4C3F68F5399D8CZ已嵌套,因此,這意味着您Z34D1F91FB2E514B8576FAB1A75A75A89A6BZ to /interviews/:interview_id/practices/new
forken_id/forking your your your your y y y y y y y y y y y y y y y y y y y y y y y y y y y params[:interview_id]
。
因此,一個簡單的解決方案是添加:
def new
@interview = Interview.find(params[:interview_id]
@practice = Practice.new
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.