属于另一个的模型让我得到无路线匹配

时间:2015-06-17 02:58:46

标签: ruby-on-rails routes associations

我正在制作我的第一个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>

1 个答案:

答案 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' %>