【问题标题】:Rails Missing JBuilder File TemplateRails 缺少 JBuilder 文件模板
【发布时间】:2017-12-24 00:35:17
【问题描述】:

我一直在尝试使用 Fullcalendar 来显示来自 JSON 提要的事件。 JSON 提要中的事件由 SchoolEventsController 生成。但是,这些事件不会显示在 Fullcalendar 上。此外,查看 JSON 文件(school_events/index.json.jbuilder) 会产生此错误:

ActionController::UnknownFormat at /calendar.json SchoolEventsController#index 缺少此请求格式和变体的模板。 request.formats:[“应用程序/json”] request.variant: []

我认为我的问题已缩小到这两个文件:

school_events_controller.rb中的索引函数:

class SchoolEventsController < ApplicationController

    def index
        @events = @calendar.events
        respond_to do |format|
            format.html # index.html.erb
            format.json # index.json.jbuilder?
        end
    end

end

school_events/index.json.jbuilder

json.array!(@events) do |event|
    date_format = event.all_day? ? '%Y-%m-%d' : '%Y-%m-%dT%H:%M:%S'
    json.id event.id
    json.title event.name
    json.start event.start_time.strftime(date_format)
    json.end event.end_time.strftime(date_format)
    json.url event_url(event, format: :html)
end

宝石文件

source 'https://rubygems.org'

git_source(:github) do |repo_name|
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?('/')
  "https://github.com/#{repo_name}.git"
end

ruby '2.3.1'
gem 'rails', '~> 5.0.2'
gem 'mime-types', '~> 3.1'
gem 'paperclip', '~> 5.0'
gem 'rmagick', '~> 2.15'
gem 'friendly_id', '~> 5.1'
gem 'closure_tree', '~> 6.0'
gem 'ancestry',     '~> 3.0'
gem 'ranked-model', '~> 0.4.0'
gem 'mailgun_rails', '0.9.0'
gem 'nested_form', '0.3.2'
gem 'event-calendar', github: 'kirandc/event_calendar', require: 'event_calendar'
gem 'jbuilder', '~> 1.2'
gem 'ransack', '~> 1.7'
gem 'sprockets-rails', '~> 3.1'
gem 'flash_cookie_session', github: 'trevorturk/flash_cookie_session'
gem 'date_validator', '~> 0.9.0'
gem 'jquery-rails',        '~> 4.1'
gem 'jquery-ui-rails',     '~> 6.0'
gem 'jquery_mobile_rails', '~> 1.3.2'
gem 'fancybox2-rails', github: 'ChallahuAkbar/fancybox2-rails', tag: 'v0.3.0'
gem 'kaminari', '~> 1.0'
gem 'redcarpet', '~> 3.3'
gem 'pg', '~> 0.21.0'
gem 'pghero', '~> 1.2'
gem 'autoprefixer-rails', '~> 7.0'
gem 'bourbon',            '~> 4.2'
gem 'normalize-rails',    '~> 4.1'
gem 'sass-rails',         '~> 5.0'
gem 'uglifier',           '~> 3.0'
gem 'bcrypt', '~> 3.1', require: false
gem 'google-api-client', '~> 0.13.0'
gem 'recaptcha', '~> 4.1', require: 'recaptcha/rails'
gem 'yajl-ruby', '~> 1.3', require: false
gem 'tinymce-rails', '~> 4.3'
gem 'turbolinks', '~> 5.0'
gem 'sunspot_rails', '~> 2.2'
gem 'image_optim',      '~> 0.25.0'
gem 'image_optim_pack', '~> 0.5.0'

group :production do
  gem 'redis-rails', '~> 5'
  gem 'sitemap_generator', '~> 5.1'
  gem 'newrelic_rpm', '~> 4.0'
  gem 'rollbar', '~> 2.11'
end

group :development, :production do
  gem 'rack-mini-profiler', '~> 0.10.1'
  gem 'whenever', '~> 0.9.4', require: false
end

group :development do
  gem 'capistrano',               '~> 3.7',   require: false
  gem 'capistrano-bundler',       '~> 1.1',   require: false
  gem 'capistrano-faster-assets', '~> 1.0',   require: false
  gem 'capistrano-rails',         '~> 1.1',   require: false
  gem 'better_errors',     '~> 2.1'
  gem 'binding_of_caller', '~> 0.7.2'
  gem 'thin', '~> 1.6'
  gem 'guard',            '~> 2.13'
  gem 'guard-livereload', '~> 2.5', require: false
  gem 'brakeman', '~> 3.3', require: false
  gem 'pry', '~> 0.10.3'
  gem 'letter_opener', '~> 1.4'
  gem 'yard', '~> 0.9.5'
  gem 'bullet', '~> 5.0'
  gem 'rubocop',       '~> 0.4',    require: false
  gem 'rubocop-rspec', '~> 1.7',    require: false
  gem 'scss_lint',     '~> 0.54.0', require: false
  gem 'progress_bar', '~> 1.0'
  gem 'sunspot_solr', '~> 2.2'
end

group :development, :test do
  gem 'spring-commands-rspec',   '~> 1.0'
  gem 'spring-commands-rubocop', '~> 0.2.0'
  gem 'rails-controller-testing', '~> 1.0.1'
  gem 'guard-rspec', '~> 4.6'
  gem 'rspec',       '~> 3.4'
  gem 'rspec-rails', '~> 3.4'
end

group :test do
  gem 'capybara', '~> 2.7'
  gem 'factory_girl_rails', '~> 4.7'
  gem 'shoulda-matchers', '~> 3.1', require: false
  gem 'launchy', '~> 2.4'
  gem 'simplecov', '~> 0.14.0', require: false
  gem 'database_cleaner', '~> 1.5', require: false
  gem 'webmock', '~> 3.0'
  gem 'accept_values_for', '~> 0.7.2'
end

routes.rb中的相关路线:

scope defaults: { calendar_name: 'School Calendar' } do
    get '/calendar/list',             to: 'school_events#list',    as: :school_calendar_list
    get '/calendar/editors',          to: 'school_events#editors', as: :editors_school_calendar
    get '/calendar(/:year(/:month))', to: 'school_events#index',
                                      as: :school_calendar,
                                      constraints: { year: /20(?:1[1-9]|20)/, month: /\d{1,2}/ }
    resources :school_events, path: '/events', except: [:index]
  end

  scope '/calendar' do
    get '/edit', to: 'school_events#edit_calendar',
                 defaults: { calendar_name: 'School Calendar' },
                 as: :edit_school_calendar
    put '/',     to: 'school_events#update_calendar',
                 defaults: { calendar_name: 'School Calendar' }

    resources :google_syncs, only: %i[new create destroy], as: :school_calendar_google_syncs do
      get :authorize, on: :collection
    end
  end

当我将 SchoolEventsController 中的 format.json 替换为 format.json { render json: @events } 时,calendar.json 将从我的数据库中输出(以 JSON 格式)所有所需的事件。我不想使用这些输出,因为我需要一个混乱的解决方法来重命名所有属性以符合 Fullcalendar 的要求。有没有人有办法解决这个问题?提前致谢!

注意:我使用的是 Rails 5

【问题讨论】:

  • 你能发布你的 Gemfile 吗?
  • @MatthewBorg 你好!我已经添加了我的 Gemfile。关于 gem 'jbuilder',虽然我在 Gemfile 中有 gem 'jbuilder', '~&gt; 1.2',但 bundle show jbuilder 说我的版本是 1.5.3。
  • 我无法重现您所显示的问题。但我认为您不需要 respond_to 块来使 jbuilder 工作。你的控制器可能只是def index; @events = @calendar.events; end
  • @MatthewBorg 我已经删除了 respond_to 块。错误仍然存​​在。如果我有 school_events/index.html.erb 会有问题
  • 不,这不会造成任何问题。 jbuilder 为以.jbuilder 结尾的文件设置模板处理程序。它应该与您的 html.erb 模板一起使用。详细地说,我用 ruby​​ 2.3.1 和你的 Gemfile 和一个 pg 数据库启动了一个新的 Rails 5.0 应用程序和一个简单的 posts 脚手架(带有 posts/index.html.erbposts/index.json.jbuilder),我在渲染jbuilder 模板,无论我的 index 操作看起来像你的还是我忽略了 respond_to

标签: ruby-on-rails fullcalendar ruby-on-rails-5 jbuilder


【解决方案1】:
$ bundle exec spring stop
$ bundle install
$ bundle exec rails s

jbuilder 有一个初始化钩子,它定义了.jbuilder 模板处理程序。没有它,Rails 不知道如何处理.jbuilder 模板文件。初始化程序没有运行,可能是因为在安装 jbuilder 或未安装 jbuilder 时,spring 从未重新启动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 2017-06-25
    • 2016-04-26
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多