【问题标题】:Can't get form to work when trying to create new item in Ruby on Rails尝试在 Ruby on Rails 中创建新项目时无法使表单工作
【发布时间】:2015-12-09 02:42:45
【问题描述】:

我刚开始自学 Ruby on Rails,我的主要学习来源是在线网站,例如 here 和 codecademy,它只能很好地解释我编码时发生的事情。

我的项目是一个非常简单的 IT 库存站点,它显示一个包含项目信息的数据库。这是用 CRUD 练习的,现在我被困在创建部分。每当我单击主页上的链接时,假设会转到带有表单的页面,他们可以输入然后提交,但它甚至不会显示带有表单的页面。这是我当前的代码。

Routes.rb

Rails.application.routes.draw do
get '/items' => 'items#index' 
get 'items/new' => 'items#new'
post 'items' => 'items#create'
root 'items#index'  #homepage and /items are same page for now

项目控制器

class ItemsController < ApplicationController
def index
    @items = InventoryItem.all
end

def new
    @item = InventoryItem.new
end

def create
    @item = InventoryItem.new(item_params)
    if @item.save
        redirect_to '/items'
    else
        render 'new'
    end
end

private
def item_params
    params.require(:item).permit( :idnumber, :vutag, :fund, :dept, :bldg, :person, :mfct, :mfctdate, :commonname, :modelnum, :serial, :cost)
end
end

new.html.erb

<%= form_for(@item) do |f| %>  
<div> 
  <%= f.label :inventoryitem %><br>
  <%= f.text_area :idnumber %><br> 
  <%= f.text_area :vutag %><br>
  <%= f.text_area :fund %><br>
  <%= f.text_area :dept %><br>
  <%= f.text_area :bldg %><br>
  <%= f.text_area :person %><br>
  <%= f.text_area :mfct %><br>
  <%= f.text_area :mfctdate %><br>
  <%= f.text_area :commonname %><br>
  <%= f.text_area :modelnum %><br>
  <%= f.text_area :serial %><br>
  <%= f.text_area :cost %><br>
</div> 
<div> 
  <%= f.submit "Create" %> 
</div> 
<% end %>

index.html

<table>
<tr>
  <th>IDNum</th>
  <th>VU Tag</th>
  <th>Fund</th>
  <th>Dept</th>
  <th>Bldg</th>
  <th>Person</th>
  <th>Mfct</th>
  <th>Mfct Date</th>
  <th>Common Name</th>
  <th>Model</th>
  <th>Serial</th>
  <th>Cost</th>
</tr>
<tr>
  <% @items.each do |item| %>
  <td> <%= item.idnumber %> </td>
  <td> <%= item.vutag %> </td>
  <td> <%= item.fund %> </td>
  <td> <%= item.dept %> </td>
  <td> <%= item.bldg %> </td>
  <td> <%= item.person %> </td>
  <td> <%= item.mfct %> </td>
  <td> <%= item.mfctdate %> </td>
  <td> <%= item.commonname %> </td>
  <td> <%= item.modelnum %> </td>
  <td> <%= item.serial %> </td>
  <td> <%= item.cost %> </td>
  <% end %>
</tr>
</table>
<br><br>
<%= link_to "New Entry", "items/new" %>

一个非常基本的应用程序,用于显示来自数据库的信息。 (一旦它起作用,我会回去让它变得漂亮。

显示表格的页面工作正常,当我单击链接并转到 items/new 时,它给了我这个错误:

NoMethodError in Items#new 
Showing /home/group3/ITSite/app/views/items/new.html.erb where line #1 raised: 
undefined method `inventory_items_path' for #<#<Class:0x007f8b11137718>:0x007f8b10012fc8>


Extracted source (around line #1): 
    <%= form_for(@item) do |f| %>  
    <div> 
    <%= f.label :inventoryitem %><br>
    <%= f.text_area :idnumber %><br> 
    <%= f.text_area :vutag %><br>
    <%= f.text_area :fund %><br>

Rails.root: /home/group3/ITSite

Application Trace | Framework Trace | Full Trace 
app/views/items/new.html.erb:1:in `_app_views_items_new_html_erb__1490812464141641456_70117522166260'

谁能帮我弄清楚错误是什么以及我需要在哪里修复它?我不相信它的 html 页面本身,而是导致它的东西,或者命名错误的东西。 Ruby on Rails 中的命名约定让我有点不知所措。

【问题讨论】:

  • 能否将rake routes 的输出添加到问题中?
  • 遵循 Tom 提到的命名约定。它更有可能发挥作用。

标签: ruby-on-rails ruby ruby-on-rails-4


【解决方案1】:

Rails 使用约定优于配置。这意味着名字很重要。您的模型是 InventoryItem。因此,您的控制器应称为 InventoryItemsController。

正如 Vasfed 所提到的,在您的路线中,惯例是使用资源方法来生成必要的路径。所以不要使用get '/items/new' 等,只需使用resources :inventory_items

假设您进行了这些更改。在您的 InventoryItemsController new 操作中,设置 @inventory_item = InventoryItem.new。当然,您可以随心所欲地调用变量,但将其称为实际名称是有意义的。这就是为什么我建议@inventory_item。到目前为止还好吗?

在您的表单中,执行以下操作:form_for(@inventory_item) do |f|。 Rails 会自动将其转换为该模型实例的“新”路径:new_inventory_item_path(又名inventory_items/new)。

【讨论】:

    【解决方案2】:

    在路由中使用resources,它会与路由一起创建命名路由。

    Rails.application.routes.draw do
      resources :items, only:[:index, :new, :create]
      root 'items#index'
    end
    

    此外,您应该将模型命名为与控制器和路由相同的名称,以便默认工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      相关资源
      最近更新 更多