【问题标题】:NoMethodError in Users#show (Ruby Rails)用户#show 中的 NoMethodError (Ruby Rails)
【发布时间】:2018-01-07 02:57:09
【问题描述】:

当我尝试包含用于提交任务项 (_form.html.erb) 的表单部分时,我在 Users#show 中遇到了 NoMethodError。我的其他部分(_item.html.erb)正在正确呈现。我的项目模型和我的用户模型是相互关联的,用户 has_many :items 和项目属于_to :user。

我们将不胜感激任何和所有的帮助!

下面是我的路线.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>

【问题讨论】:

  • resources :items, only: [:new, :create]更改为resources :items, only: [:new, :create, :index]

标签: ruby-on-rails ruby partials


【解决方案1】:

在您的routes.rb 文件中,您将项目定义为nested resource。您可以通过在终端上运行以下命令来检查所有路线:rake routes

对于你的路线,你说:

resources :users do
  resources :items, only: [:new, :create]
end

这将为您提供GET /users/:user_id/items/newPOST /users/:user_id/items 的路线。但是,在您的表单中,您似乎正在尝试执行此操作:&lt;%= form_for @item do |f| %&gt;。您没有为项目本身定义路线。您还需要提供用户。

为您的表单试试这个:

<%= form_for [@user, @item] do |f| %>

在您的ItemsController 中类似这样的内容:

class ItemsController
  def new
    @user = current_user
    @item = Item.new
  end
end

【讨论】:

  • 谢谢,您的解释很清楚,帮助解决了我的问题!
【解决方案2】:

您的items 路由嵌套在users 下。因此,您必须将两者都传递给 form_for - 一个用户和一个项目。

这样的事情可能会起作用:

<%= form_for(current_user, @item) do |f| %>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    相关资源
    最近更新 更多