如何为项目创建新的/创建操作?

时间:2015-05-29 15:44:53

标签: ruby-on-rails

我正在进行铁路分配,要求我创建一个项目列表。我为项目创建了控制器和模型,但仍然遇到了一些麻烦。我一直收到以下错误:

undefined method `items_path' for 

以下是我的一些代码:

class ItemsController < ApplicationController
  def new
    @item = Item.new
  end

  def create
    @item = Item.new(params.require(:item).permit(:name))
     if @item.save
       flash[:notice] = "Item was saved."
       redirect_to @item
     else
       flash[:error] = "There was an error saving the item. Please try again."
       render :new
     end
   end
end

项目模型:

class Item < ActiveRecord::Base
  belongs_to :user
end

项目中的New.html.erb

class Item < ActiveRecord::Base
  belongs_to :user
end

Routes.rb:

Rails.application.routes.draw do
  devise_for :users
  resources :users do
    resources :items, only: [:new, :create]
  end

  get 'welcome/index'
  root :to => 'welcome#index'
end

Item.html.erb

<%= form_for @item do |f| %>
   <%= f.label :name %>
   <%= f.text_field :name %>

   <%= f.submit "Save" %>
<% end %>

3 个答案:

答案 0 :(得分:3)

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

这将在用户内嵌套项路由。检查rake routes,您将无法获得此items_path

您必须定义resource :items才能获得items_path

因此,如果您想使用嵌套路由,则必须更新表单和控制器,如果不是仅更新路由resource :items

<%= form_for [@user, @item] do |f| %>
   <%= f.label :name %>
   <%= f.text_field :name %>

   <%= f.submit "Save" %>
<% end %>

和控制器

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

答案 1 :(得分:0)

您已在用户下嵌套了您的商品资源。它应该是 user_items_path

答案 2 :(得分:0)

这些项目嵌套在用户之下,因此他们始终必须拥有相应的用户。示例/users/1/item/3

如果记录的用户是创建项目的用户,则表单应如下所示:

<%= form_for [current_user, @item] do |f| %>
  <%= f.label :name %>
  <%= f.text_field :name %>

  <%= f.submit "Save" %>
<% end %>

如果您可以为其他用户创建项目,则必须在控制器的新操作中创建@user实例,然后更改current_user的{​​{1}}