用户中的 NoMethodError#show (Ruby Rails)
NoMethodError in Users#show (Ruby Rails)
我 运行 在我的 Users#show 中尝试包含用于提交任务项的部分表单时遇到 NoMethodError (_form.html.erb)。我的另一个部分 (_item.html.erb) 正在正确渲染。我的项目模型和我的用户模型相互关联,用户 has_many :items 和项目 belongs_to :user.
任何帮助将不胜感激!
下面是我的routes.rb
Rails.application.routes.draw do
get 'welcome/index'
get 'welcome/about'
root 'users#show'
resources :users do
resources :items, only: [:new, :create]
end
devise_for :users
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
下面是我的终端输出
ActionView::Template::Error (undefined method `items_path' for #<#<Class:0x007fefeca61dd0>:0x007fefeca58b18>
Did you mean? items_create_path):
1: <h4> Create a new to-do item </h4>
2:
3: <%= form_for @item do |f| %>
4: <%= f.label :name %>
5: <%= f.text_field :name, class: 'form-control', placeholder: "Enter task here" %>
物品控制器
class ItemsController < ApplicationController
def new
@item = Item.new
end
def create
@item = Item.new
@item.user = current_user
@item.name = params[:item][:name]
if @item.save
flash[:notice] = "Item saved"
redirect_to @item
else
flash.now[:alert] = "Item was not created, please try again."
render :new
end
end
end
用户控制器
class UsersController < ApplicationController
def show
if !current_user.nil?
@user = current_user
@item = Item.new
@items = @user.items
else
redirect_to new_user_registration_path
end
end
end
用户#显示页面
<h2> Your to-do list</h2>
<div class="col-md-8">
<div class='items'>
<%= render partial: "items/item", local: { item: @item} %>
</div>
</div>
<div class="col-md-8">
<div class='new-item'>
<%= render partial: "items/form", local: { item: @item } %>
</div>
</div>
您的 items
路线嵌套在 users
下。因此,您必须将两者都传递给 form_for
- 一个用户和一个项目。
像这样的东西可能会起作用:
<%= form_for(current_user, @item) do |f| %>
在您的 routes.rb
文件中,您将项目定义为 nested resource。您可以在终端上通过 运行 此命令检查所有路线:rake routes
.
对于你的具体路线,你说:
resources :users do
resources :items, only: [:new, :create]
end
这将为您提供 GET /users/:user_id/items/new
和 POST /users/:user_id/items
的路线。但是,在您的表单中,您似乎正在尝试这样做:<%= form_for @item do |f| %>
。您没有为项目本身定义的路线。您还需要提供一个用户。
为您的表格试试这个:
<%= form_for [@user, @item] do |f| %>
在你的ItemsController
中有这样的东西:
class ItemsController
def new
@user = current_user
@item = Item.new
end
end
我 运行 在我的 Users#show 中尝试包含用于提交任务项的部分表单时遇到 NoMethodError (_form.html.erb)。我的另一个部分 (_item.html.erb) 正在正确渲染。我的项目模型和我的用户模型相互关联,用户 has_many :items 和项目 belongs_to :user.
任何帮助将不胜感激!
下面是我的routes.rb
Rails.application.routes.draw do
get 'welcome/index'
get 'welcome/about'
root 'users#show'
resources :users do
resources :items, only: [:new, :create]
end
devise_for :users
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
下面是我的终端输出
ActionView::Template::Error (undefined method `items_path' for #<#<Class:0x007fefeca61dd0>:0x007fefeca58b18>
Did you mean? items_create_path):
1: <h4> Create a new to-do item </h4>
2:
3: <%= form_for @item do |f| %>
4: <%= f.label :name %>
5: <%= f.text_field :name, class: 'form-control', placeholder: "Enter task here" %>
物品控制器
class ItemsController < ApplicationController
def new
@item = Item.new
end
def create
@item = Item.new
@item.user = current_user
@item.name = params[:item][:name]
if @item.save
flash[:notice] = "Item saved"
redirect_to @item
else
flash.now[:alert] = "Item was not created, please try again."
render :new
end
end
end
用户控制器
class UsersController < ApplicationController
def show
if !current_user.nil?
@user = current_user
@item = Item.new
@items = @user.items
else
redirect_to new_user_registration_path
end
end
end
用户#显示页面
<h2> Your to-do list</h2>
<div class="col-md-8">
<div class='items'>
<%= render partial: "items/item", local: { item: @item} %>
</div>
</div>
<div class="col-md-8">
<div class='new-item'>
<%= render partial: "items/form", local: { item: @item } %>
</div>
</div>
您的 items
路线嵌套在 users
下。因此,您必须将两者都传递给 form_for
- 一个用户和一个项目。
像这样的东西可能会起作用:
<%= form_for(current_user, @item) do |f| %>
在您的 routes.rb
文件中,您将项目定义为 nested resource。您可以在终端上通过 运行 此命令检查所有路线:rake routes
.
对于你的具体路线,你说:
resources :users do
resources :items, only: [:new, :create]
end
这将为您提供 GET /users/:user_id/items/new
和 POST /users/:user_id/items
的路线。但是,在您的表单中,您似乎正在尝试这样做:<%= form_for @item do |f| %>
。您没有为项目本身定义的路线。您还需要提供一个用户。
为您的表格试试这个:
<%= form_for [@user, @item] do |f| %>
在你的ItemsController
中有这样的东西:
class ItemsController
def new
@user = current_user
@item = Item.new
end
end