首页 > 解决方案 > 为什么发布/创建方法失败并出现错误

问题描述

我是 RoR 的新手。想试试我的下一个网络应用程序是否应该基于 RoR。开始遵循这条线索:https ://guides.rubyonrails.org/getting_started.html 。一开始就像一个魅力,但我无法让该死的东西创造新的记录。任何关于我所缺少的提示都表示赞赏。

我得到的错误是:

D, [2020-12-18T09:59:56.917197 #132399] DEBUG -- : Createevent
F, [2020-12-18T09:59:56.917893 #132399] FATAL -- :   
ActionController::ParameterMissing (param is missing or the value is empty: Event):
  
app/controllers/event_controller.rb:33:in `event_params' 

我的路由如下所示:

Rails.application.routes.draw do
    post 'event/new', to: 'event#create'
    resources :event 
end

(我对指定上面的 POST 的需要感到困惑,但没有它,create 永远不会被触发。)。

事件控制器如下所示:

class EventController < ApplicationController
  def index
    @events = Event.all
  end

  def show
    @event = Event.find(params[:id])
  end

  def new
    logger = Rails.logger
    logger.info 'NewEvent'
    @event = Event.new
  end

  def create
    logger = Rails.logger
    logger.debug 'Createevent'

    @event = Event.new(event_params)

    logger.debug 'Eventcreated'

    if @event.save
      redirect_to event_path
    else
      render :new
    end
  end

  private
    def event_params
      params.require(:Event).permit(:EventName, :Description, :EventStart, :EventEnd, :Maxparticipants, :Waitlist )
    end

end

索引和显示工作正常。

new.html.erb 看起来像这样:

<h1>New Event</h1>

dsfsdfds

<%= form_with model: @Event do |form| %>
  <div>
    <%= form.label :eventname %><br>
    <%= form.text_field :EventName %>
    <%= @event.errors.full_messages_for(:EventName).each do |message| %>
      <div><%= message %></div>
    <% end %>
  </div>

  <div>
    <%= form.label :Description %><br>
    <%= form.text_field :Description %>
    <%= @event.errors.full_messages_for(:description).each do |message| %>
      <div><%= message %></div>
    <% end %>
  </div>

  <div>
    <%= form.label :EventStart %><br>
    <%= form.text_field :EventStart %>
    <%= @event.errors.full_messages_for(:eventstart).each do |message| %>
      <div><%= message %></div>
    <% end %>
  </div>

  <div>
    <%= form.label :Eventend %><br>
    <%= form.text_field :Eventend %>
    <%= @event.errors.full_messages_for(:eventend).each do |message| %>
      <div><%= message %></div>
    <% end %>
  </div>

  <div>
    <%= form.label :Maxparticipants %><br>
    <%= form.text_field :Maxparticipants %>
    <%= @event.errors.full_messages_for(:Maxparticipants).each do |message| %>
      <div><%= message %></div>
    <% end %>
  </div>

  <div>
    <%= form.label :Waitlist %><br>
    <%= form.text_field :Waitlist %>
    <%= @event.errors.full_messages_for(:waitlist).each do |message| %>
      <div><%= message %></div>
    <% end %>
  </div>

  <div>
    <%= form.submit %>
  </div>

  <%= submit_tag "Create" %>


<% end %>

路线:

                              Prefix Verb   URI Pattern                                                                              Controller#Action
                            event_new POST   /event/new(.:format)                                                                     event#create
                          event_index GET    /event(.:format)                                                                         event#index
                                      POST   /event(.:format)                                                                         event#create
                            new_event GET    /event/new(.:format)                                                                     event#new
                           edit_event GET    /event/:id/edit(.:format)                                                                event#edit
                                event GET    /event/:id(.:format)                                                                     event#show
                                      PATCH  /event/:id(.:format)                                                                     event#update
                                      PUT    /event/:id(.:format)                                                                     event#update
                                      DELETE /event/:id(.:format)                                                                     event#destroy

使用创建的事物:

bin/rails generate model Event EventName:string Description:string EventStart:datetime EventEnd:datetime Maxparticipants:integer WaitList:integer
bin/rails generate controller Event index 

版本:

About your application's environment
Rails version             6.0.3.4
Ruby version              ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-linux]
RubyGems version          3.1.4
Rack version              2.2.3

感谢 Hackman & nathanvda 的澄清。我把所有东西都抓了一遍,然后重新开始,我终于让它工作了。不过,我的口味仍然有太多的木头和黑魔法。错误消息部分让我连续三个小时感到困惑。

如前所述,我遵循指南,因此最终使用(新)

<%= form_with model: @event do |form| %>

  <% if @event.errors.any? %>
    <h2>Errors</h2>
    <ul>
      <% @event.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
    </ul>
  <% end %>  
  ...

哪个有效(嗯,有点)。如果没问题,记录会被保存,验证规则会被触发

class Event < ApplicationRecord
  validates :eventname, presence: true
  validates :description, presence: true, length: { minimum: 20 }
end

如果违反,则不会将任何记录写入数据库,但也不会出现错误消息。零。没有什么。在互联网上闲逛后,我最终改为

<%= form_for @event do |form| %>

然后错误报告工作。此解决方案的唯一问题是不鼓励使用 form_for,因为它已过时。

最终版本最终成为:

<%= form_with model: @event, local: true  do |form| %>

哪个有诀窍。

我评估的下一步将是使用自然键,因为对于该项目所需的某些数据结构,代理键的使用不是一个选项。(在我四处寻找的过程中,我得到的印象是自然键是 RoR 中的某种痛牙,但时间会证明这一点。

标签: ruby-on-rails

解决方案


首先,您在路线中的资源应该是多元化的。所以resources :event应该是resources :events

控制器名称也应该是复数形式。所以EventController会变成EventsController.

现在所需的路由应该可以正常工作了,您可以摆脱 routes.rb 中指定的 POST

现在在您的控制器中,您有 event_params 方法。最好将这样的名称小写/snake_case:

  def event_params
    params.require(:event).permit(:event_name #etc)
  end

如果您在 DB 中的列名是 EventName 等,我建议重命名它们。

最后一件事:在您的表单中,您@Event使用大写字母,而在您使用小写字母定义的 controller#new 操作@event中。到处使用小写字母。


推荐阅读