ruby-on-rails - 为什么发布/创建方法失败并出现错误
问题描述
我是 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 中的某种痛牙,但时间会证明这一点。
解决方案
首先,您在路线中的资源应该是多元化的。所以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
中。到处使用小写字母。
推荐阅读
- ios - SwiftUI:InsetGroupedListStyle 列表和全角标题
- java - AppUpdateService 不显示更新可用
- go - 将 Mac 地址转换为 HardwareAddr
- mongodb - 有没有办法在 MongoDB 领域函数中添加 npm 包?
- c - C结构:字段复制顺序
- javascript - 如何在Vuex中的第一个计时器到期后启动第二个计时器?
- c# - 使用 Docker Swarm 等待服务准备好(通过 TCP)
- java - AES-256-GCM 解码
- jquery - 获得ajax成功后数据表的布局被改变
- fasttext - FastText 窗口大小