【发布时间】:2018-10-10 15:15:57
【问题描述】:
我遇到了这个问题,我的控制器的“新”和有时“编辑”操作会抛出:
First argument in form cannot contain nil or be empty
虽然我 100% 确定第一个参数不是 nil 也不是空的。为了磨练这一点,我只会询问“新”操作,因为资源只是设置为Resource.new
permissions/new.haml
= form_for @permission do |f|
= f.label :name, class: 'form-control-label'
= f.text_field :name, class: 'form-control'
permissions_controller.rb
class PermissionsController < ApplicationController
before_action :set_permission, only: [:show, :edit, :update, :destroy]
def new
@permission = Permission.new
end
def show
@modules = Modules.all
end
def index
// handling content with api calls instead
end
...
end
我遇到这个问题很久了,但直到现在我才想出在我的开发环境中成功重现它。
我可以通过转到同一控制器的“显示”动作,然后返回“索引”动作,然后转到“新”动作来重现此问题。此时,“新”页面不再起作用,直到我编辑控制器文件或重新启动服务器。
在更改控制器(在末尾添加一个空格)或重新启动服务器后,它突然又可以工作了。
这不是发生这种情况的唯一资源。像用户这样的其他资源通常也有同样的问题。我有多个项目都有相同的问题,但不知何故消失了,所以我从来没有费心对此进行更多调查。
Ruby 版本:2.3.5p376
Rails 版本:5.1.4
编辑:
我注意到如果我注释掉Modules.all,我将无法再复制它。
modules 不是一个 activerecord 类,它是一个帮助类,让我可以读取目录中的不同文件,这样读取会不会有问题?
modules.rb
class Modules
def self.all
controllers = Dir.glob("#{Rails.root}/app/controllers/**/*.rb").
map{ |e|
if e.include?('/api/')
e.match(/api\/[^\/]*\/[^\/]*.rb/)[0].gsub('.rb', '').gsub('/', '::_').camelcase
else
e.match(/[^\/]*.rb/)[0].gsub('.rb', '').camelcase
end
}
modules = {}
controllers.each do |e|
c = Object.const_get e
modules[e.gsub(':','').gsub('Controller', '').underscore] = get_actions_for c if
!no_permission_needed_for e and c.action_methods.size > 0
end
return modules
end
def self.get_actions_for(controller)
actions = controller.action_methods
grouped_actions.each do |key, value|
actions.delete(key)
end
return actions
end
def self.grouped_actions
{"new" => "create", "edit" => "update"}
end
end
编辑:
我注意到我正在尝试调用actions.delete(key),其中操作是Set 的字符串,其中key 是String
当我执行actions = controller.action_methods.to_a 并将集合强制设置为数组时,我的问题似乎消失了。至少我不能再复制它了。现在我想知道 ruby 是否存在根本性的问题,即从 Set 中删除某些内容会导致一些奇怪的事情发生。
【问题讨论】:
-
我想知道您为什么将表单提交给
url: permissions_path,即通过向index方法发送POST/PUT 请求?为什么不使用标准的create / update? -
你可能指的是
permissions_controller.rb,而不是permissionscontroller.rb? -
我的错,错字,文件被正确命名为 permissions_controller.rb。至于额外的 url,你是对的,它是不必要的,表单助手应该自己正确处理它
-
我刚想到如果表单验证失败,您可以从
index操作调用渲染new.haml模板,其中@permission未设置 -
即使我在
index中设置了@permission = Permission.new,问题仍然存在。所以我猜这不是原因。
标签: ruby-on-rails ruby ruby-on-rails-5