Rails 6: NoMethodError и ошибки неопределенного метода

Я пытаюсь добавить кнопку действия публикации, чтобы загрузить CSV, чтобы получить данные из CSV в базу данных postGreSQL. Но получаю следующую ошибку (скопировал ошибку из ответа на запрос chrome devtools)

NoMethodError in Admin::UnitsController#import

undefined method `content_type' for nil:NilClass
Extracted source (around line #15):

#13     file = params[:file]
#14     
*15     return redirect_to import_admin_tenant_site_units_path, notice: 'Only CSV please' unless file.content_type == "text/csv"

Я пробовал следующее, что дает мне ошибку.

Вслед за routes.rb

  namespace :admin do
    get '', to: 'dashboard#index', as: 'root'
    # resourceful routes 
    resources :oauth_clients
    resources :tenants do
      resources :sites do
        #resources :production_shifts
        resources :units do
          resources :log_data_fields, only: [:create, :index]
            # collection route 
            collection do 
              post :import #post action 
            end
          member do
            get :logs
            get :export_log
          end
          resources :reports
          resources :grafana_dashboards
          resources :data_adapters, except: [:show]
          get 'data_adapters/start'
        end
      end
      resources :users
      resources :login_activities
      # resources :login_activities
    end
  end

Где пост-действие «импорт» в настоящее время вызывает озабоченность по поводу этой ошибки.

Я включил логику метода импорта в units_controller.rb следующим образом:

class Admin::UnitsController < Admin::BaseController

  # import request(this is gonna be a POST action)
  def import
    logger.debug("*****Testing the logger.*****")
    
    file = params[:file]
    
    return redirect_to import_admin_tenant_site_units_path, notice: 'Only CSV please' unless file.content_type == "text/csv"
    
    file = File.open(file)
    csv = CSV.parse(file, headers: true) 
    
    binding.b
    
    redirect_to import_admin_tenant_site_units_path, notice:"Imported tags !"
  end

Еще многое предстоит сделать, и я даже не могу показать полный код публично из-за ограничений. Моя жемчужина отладки рельсов debug не работает, что означает, что она не вызывается даже после упоминания ее там как binding.b. Раньше он работал несколько дней назад, но я не знаю, какие ошибки я сделал. И извините за плохой язык объяснения.

Здесь я также показываю код представления внешнего интерфейса той части, из которой загружается файл csv. importtags.html.haml :

%p{:style => "color: green"}= notice

= form_with model:@log_data_field, url: import_admin_tenant_site_units_path, method: :post do |form|

    - if @log_data_field.errors.any?
        #error_explanation
            %h2= "#{pluralize(@log_data_field.errors.count, "error")} prohibited this log_data_field from being saved:"
            %ul
            - @log_data_field.errors.full_messages.each do |message|
                %li= message

    = form.file_field :file, accept: ".csv"
    <br>
    <br>

    -#button.btn.primary{:type => "submit", data: { disable_with: "Please wait..."}}
    %button.btn.primary{:type => "submit"}
        -#= form.button "Import"
        = "Import"

PS: -# указывают комментарии в приведенном выше коде haml.

Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения &quot;многие ко многим&quot; в Laravel с методами присоединения и отсоединения
Отношения &quot;многие ко многим&quot; в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
0
0
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Params[:file] — это nil, поэтому локальная переменная file также будет nil.

В журнале рельсов вы можете увидеть хеш параметров обычно после строк Started POST и Processing by, таких как Parameters: {...} Но вы всегда можете просто использовать puts внутри контроллера для отладки, как p params, чтобы увидеть его содержимое.

Бьюсь об заклад, ключ file внутри хэша params будет вложен под названием вашей модели.

Попробуйте file = params[:YOUR_MODEL_NAME][:file]

Может file = params[:log_data][:file]? :D

Ого вау спасибо большое!! Внес изменения, как вы сказали, в строку импорта def -> file = params[:log_data_field][:file], и это сработало, а также была сгенерирована консоль отладки: D

Meet Makwana 20.11.2022 10:00

Другие вопросы по теме