代码之家  ›  专栏  ›  技术社区  ›  Rebirth

表单中的第一个参数不能包含nil或为空,但不应为nil或空

  •  -1
  • Rebirth  · 技术社区  · 6 年前

    我的控制器的“新建”和有时的“编辑”操作会引发以下问题:

    First argument in form cannot contain nil or be empty

    Resource.new

    权限/new.haml

    = form_for @permission do |f|
      = f.label :name, class: 'form-control-label'
      = f.text_field :name, class: 'form-control'
    

    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
    

    我可以通过转到同一控制器的'show'操作,然后返回'index'操作,然后转到'new'操作来重现这个问题。在这一点上'新'页不再工作,直到我编辑控制器文件或重新启动服务器。

    这不是发生这种情况的唯一资源。像User这样的其他资源通常也有同样的问题。我已经有多个项目,有相同的问题,不知何故消失,所以我从来没有费心调查更多的这个问题。

    Ruby版本:2.3.5p376

    编辑:

    我注意到,如果我把它注释掉,我就不能再复制了 Modules.all .

    模块.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中是否有什么地方出了问题,从 在引擎盖下做奇怪的事情。

    2 回复  |  直到 6 年前
        1
  •  0
  •   John Baker    6 年前

    但有一种方法是 未推荐的 Permission 窗体内的实例:

    <%= form_for Permission.new do |f| %>
    

    检查包含窗体的视图是否由 new PermissionsController .

        2
  •  0
  •   Rebirth    6 年前

    我想我已经弄明白了。

    我注意到的是 modules.rb 我正在通过 controller.action_methods . 在此之后,我将删除 new edit

    我的假设是,我只是接收到一组包含动作名称的字符串,而不是实际动作。所以如果我删除 新的 编辑 我的观点默认为 新的 ActionController::Base中的操作。这意味着@permission没有设置,视图抛出了一个当之无愧的错误。

    我假设这样做会在运行时删除控制器的这些操作。这意味着在我重新启动服务器后,它当然会再次工作。

    controller.action_methods.to_a 强制解耦控制器中的实际操作。在此之后,我可以自由地删除这个数组中我不需要的字符串。

    controller.action\u方法 ?