我正在制作我的第一个Rails应用程序并且错误比比皆是。我搜索过“没有路线匹配”的问题,但我找不到符合我问题的问题。
我有一个用户模型。它has_many:任务,它has_one:pet。 Task和Pet模型都属于:user。任务和宠物没有自己的页面,它们出现在用户页面上。使用Task,这很好用。这是users_controller.rb中的show动作
def show
@user = User.find(params[:id])
@tasks = @user.tasks.paginate(page: params[:page])
@pet = @user.pet
end
我在@user show.html.erb页面上有@tasks的提要,以及用于创建任务的表单。我还有一个用于创建@pet的表单。但是,当我单击@pet创建表单上的提交按钮时,它将转到错误页面。
路由错误。没有路线匹配[PATCH]“/ pet / 1”
奇怪的是,看着路线,我看到了:
tasks POST /tasks(.:format) tasks#create
task DELETE /tasks/:id(.:format) tasks#destroy
pet_index POST /pet(.:format) pet#create
pet DELETE /pet/:id(.:format) pet#destroy
root GET / static_pages#home
pet#create的地址为pet_index,尽管我当然没有故意这样做。用户只有一只宠物,宠物指数毫无意义。我创建了Pets模型,就像我做的Tasks模型一样,但是在某个地方,出了点问题。两者之间的差异与这样一个事实有关,即有几个@tasks被创建和销毁,而宠物只有一个。
这是pets_controller.rb
class PetsController < ApplicationController
before_action :signed_in_user
def create
@pet = current_user.build_pet(pet_params)
if @pet.save
flash[:success] = "Your pet is ready!"
redirect_to root_url
else
render 'static_pages/home'
end
end
def destroy
end
private
def pet_params
params.require(:pet).permit(:nome)
end
end
我还有一个共享/ _pet.html.erb部分,其中包含无法访问用户的代码。
<%= @user.pet.nil? ? "Pet name" : @user.pet.name %>
如果我把
<%= render 'shared/pet' %>
home.html.erb中的,它给了我这个错误:
StaticPages #home中的NoMethodError。未定义的方法`pet'for 零:NilClass
这是一团糟。我感谢任何帮助。
编辑:这是宠物创作表单,在shared / pet_form.html.erb
中<%= form_for(@pet) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<div class="field">
<%= f.text_area :name, placeholder: "Give your pet a name." %>
</div>
<%= f.submit "Meet pet", class: "btn btn-small btn-default" %>
<% end %>
编辑2:这是config / routes.rb
Petrefa::Application.routes.draw do
resources :users
resources :sessions, only: [:new, :create, :destroy]
resources :tasks, only: [:create, :destroy]
resources :pet, only: [:create, :destroy]
root 'static_pages#home'
match '/register', to: 'users#new', via: 'get'
match '/help', to: 'static_pages#help', via: 'get'
match '/developers', to: 'static_pages#about', via: 'get'
match '/login', to: 'sessions#new', via: 'get'
match '/logout', to: 'sessions#destroy', via: 'delete'
end
编辑3:将form_for(@pet) do
更改为form_for(@pet, method: :create, action: '/pet') do
后,这就是生成的HTML
<form accept-charset="UTF-8" action="/pet/1" class="edit_pet" id="edit_pet_1" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓"><input name="_method" type="hidden" value="create"><input name="authenticity_token" type="hidden" value="fC/PjvsGPG1sKSGvzFSFfzSKAhUZv99w6fkmiRkLRU0="></div>
<div class="field">
<textarea id="pet_nome" name="pet[nome]" placeholder="Dê um nome para o seu petRefa.">fulano</textarea>
</div>
<input class="btn btn-small btn-default" name="commit" type="submit" value="Conhecer pet">
</form>
答案 0 :(得分:0)
首先,如果你想创建一个宠物,你应该使用POST而不是PATCH请求。 POST请求将被重定向到create方法,而PATCH请求将被重定向到update方法,该方法不存在且在PetsController
中没有路由。您可以指定在HTML表单中使用哪个操作(如POST或PATCH)。
其次,您确定在@user
中设置了StaticPages#home
吗?这可能是undefined method `pet' for nil:NilClass`
。
另外,我认为要渲染部分内容,您应该使用<%= render partial: 'shared/pet' %>