删除/销毁和编辑路由
Posted
技术标签:
【中文标题】删除/销毁和编辑路由【英文标题】:Delete/Destroy and Edit routing 【发布时间】:2015-11-08 01:29:21 【问题描述】:我是 Rails 的新手,正在尝试为一个项目构建自己的应用程序。我在尝试创建删除和编辑时不断收到此错误。
Listings中的NameError#show
这是我的 routes.rb 文件...
Rails.application.routes.draw do
resources :listings
root 'listings#home'
get '/listings/new' => 'listings#new'
post '/listings' => 'listings#create'
get '/listings/:id' => 'listings#show'
get '/listings/:id/edit' => 'listings#edit'
patch '/listings/:id' => 'listings#update'
delete '/listings/:id' => 'listings#destroy'
end
# Prefix Verb URI Pattern Controller#Action
# listings GET /listings(.:format) listings#index
# POST /listings(.:format) listings#create
# new_listing GET /listings/new(.:format) listings#new
# edit_listing GET /listings/:id/edit(.:format) listings#edit
# listing GET /listings/:id(.:format) listings#show
# PATCH /listings/:id(.:format) listings#update
# PUT /listings/:id(.:format) listings#update
# DELETE /listings/:id(.:format) listings#destroy
这是我的列表控制器...
class ListingsController < ApplicationController
before_action :set_listing, only: [:edit, :update, :destroy]
def index
@listings = Listing.all
end
def show
@listings = Listing.find(params[:id])
end
def new
@listings = Listing.new
end
def create
@listings = Listing.new(listing_params)
@listings.save
redirect_to listings_path
end
end
def edit
end
def update
if @listings.update(listing_params)
redirect_to listings_path
else
render :edit
end
def destroy
@listings = Listing.find(params[:id])
redirect_to listings_url
end
def set_listing
@listings = Listing.find(params[:id])
end
def listing_params
params.require(:listing).permit(:address, :unit, :price, :description, :img_url)
end
end
这是我的 show.html.erb 文件...
<center><h2>Current Listing</h2></center>
<h4>Address:</h4> <h3><%= @listings.address %></h3>
<h4>Unit #:</h4> <h3><%= @listings.unit %></h3>
<h4>Price: $</h4> <h3><%= @listings.price %></h3>
<h4>Description:</h4> <h3><%= @listings.description %></h3>
<h4>Agent ID:</h4> <h3><%= @listings.agent_id %></h3>
<h4>Image:</h4> <h3><%= @listings.img_url %><p></h3>
<%= link_to 'Back', listings_path %>
<%= link_to 'Delete', listing, :method => 'delete' %>
【问题讨论】:
【参考方案1】:最有可能出现错误:
<%= link_to 'Delete', listing, :method => 'delete' %>
listing
没有定义,你应该使用你在控制器中定义的@listings
。
其他几件事:
@listings
在这里是极具误导性的名称。如果是单数对象,请使用单数形式@listing
。当你明年回到这个代码时,它会让你的生活更轻松。当然,在处理集合(索引操作)时,您仍然应该使用@listings
。
你已经有了一种方法来做你在表演动作中所做的事情 - set_listings
。只需将show
添加到before_action
旁边的列表中即可干燥您的代码。
resources :listings
已经为所有列表操作创建了路由,无需“手动”定义它们。
始终、始终、始终查看(并在您的问题中发布)完整的错误消息。它会让你对发生的事情有更多的了解。可以提高NameError
的原因有数千个。 nameError: undefined method listing for <ActionViev...>
将其缩小到只有几个,而您的回溯会将其缩小到一个点。
【讨论】:
【参考方案2】:将删除链接更改为
<%= link_to 'Delete', listing_path(@listings),
:confirm => 'Are you sure?', :method => :delete %>
从 routes.rb 中删除以下路由,因为路由文件中的 resources :listings
将自动提供这些路由
get '/listings/new' => 'listings#new'
post '/listings' => 'listings#create'
get '/listings/:id' => 'listings#show'
get '/listings/:id/edit' => 'listings#edit'
patch '/listings/:id' => 'listings#update'
delete '/listings/:id' => 'listings#destroy'
【讨论】:
以上是关于删除/销毁和编辑路由的主要内容,如果未能解决你的问题,请参考以下文章
如何使用模型类在 laravel 8 资源控制器中编辑、销毁和获取单个值?