Reputation: 348
I cannot get my jquery to work from the asset pipeline and I have tried a host of things to fix and nothing is working and I just can't seem to figure this out. I have a simple jquery function for now to test it. Note, it works when I put the jquery code in the HTML.
app/javascripts/application.js
//= require jquery
//= require jquery.turbolinks
//= require jquery_ujs
//= require turbolinks
//= require bootstrap
//= require_tree .
$("#hide").click(function(){
$("p").hide();
});
$("#show").click(function(){
$("p").show();
});
HTML
<body>
<p>If you click on the "Hide" button, I will disappear.</p>
<button id="hide">Hide</button>
<button id="show">Show</button>
</body>
GemFile
source 'https://rubygems.org'
gem 'pg', '0.17.1'
gem 'rails', '4.2.2'
gem 'puma', '3.4.0'
gem 'sass-rails', '4.0.3'
gem 'uglifier', '3.0.0'
gem 'coffee-rails', '4.1.0'
gem 'jquery-rails', '4.1.1'
gem 'turbolinks', '2.3.0'
gem 'jbuilder', '2.2.3'
gem 'bootstrap-sass', '3.2.0.0'
gem 'sdoc', '~> 0.4.0', group: :doc
gem 'contact_us', '~> 1.0.1'
gem 'simple_form'
gem 'aws-sdk', '< 2.0'
gem 'will_paginate'
gem 'ransack'
gem 'figaro'
gem 'jquery-turbolinks'
gem 'devise'
gem 'devise_security_extension'
gem 'stripe'
group :development, :test do
gem 'pg', '0.17.1'
gem 'byebug', '3.4.0'
gem 'web-console', '2.0.0.beta3'
gem 'spring', '1.1.3'
gem 'foreman'
end
group :production do
gem 'pg', '0.17.1'
end
Config/development
Rails.application.configure do
# Settings specified here will take precedence over those in config/application.rb.
# In the development environment your application's code is reloaded on
# every request. This slows down response time but is perfect for development
# since you don't have to restart the web server when you make code changes.
config.cache_classes = false
config.assets.initialize_on_precompile = false
# Emailer.
config.action_mailer.default_url_options = { :host => 'localhost:3000' }
config.action_mailer.raise_delivery_errors = true
config.action_mailer.smtp_settings = {
address: "smtp.sendgrid.net",
port: 587,
domain: ENV["HEROKU_DOMAIN"],
authentication: "plain",
enable_starttls_auto: true,
user_name: ENV["SENDGRID_USERNAME"],
password: ENV["SENDGRID_PASSWORD"]
}
# Do not eager load code on boot.
config.eager_load = false
# Show full error reports and disable caching.
config.consider_all_requests_local = true
config.action_controller.perform_caching = false
# Don't care if the mailer can't send.
config.action_mailer.raise_delivery_errors = false
# Print deprecation notices to the Rails logger.
config.active_support.deprecation = :log
# Raise an error on page load if there are pending migrations.
config.active_record.migration_error = :page_load
# Debug mode disables concatenation and preprocessing of assets.
# This option may cause significant delays in view rendering with a large
# number of complex assets.
config.assets.debug = true
# Asset digests allow you to set far-future HTTP expiration dates on all assets,
# yet still be able to expire them through the digest params.
config.assets.digest = true
# Adds additional error checking when serving assets at runtime.
# Checks for improperly declared sprockets dependencies.
# Raises helpful error messages.
config.assets.raise_runtime_errors = true
# Raises error for missing translations
# config.action_view.raise_on_missing_translations = true
end
Upvotes: 6
Views: 2417
Reputation: 17919
Your elements didn't appear on the page yet. So just simply wrap your actions in jQuery document.ready
to wait them
$( document ).ready(function() {
$("#hide").click(function(){
$("p").hide();
});
});
Documentation: $( document ).ready()
Upvotes: 13
Reputation: 345
Why don't you try to create a new file inside your app/assets/javascripts
folder and put your code here? First lines of application.js
say
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// compiled file.
Make sure your assets are recompiled on each request. If so, you should see a list of GET request to the server on each page load in the development.log
Upvotes: 2
Reputation: 484
You can do it by creating the corresponding .js.erb file for the html file mentioned above and add the jquery in that. For eg suppose the html is in index.html.erb, create index.js.erb and place the jquery in it.
index.js.erb:
$("#hide").click(function(){
$("p").hide();
});
$("#show").click(function(){
$("p").show();
});
Then in application.js, append this:
$(function() {
$.getScript("/<model name path>.js");
});
where you can place the model name path (for eg posts.js) in case your url is /posts for the index html page. I replicated all this in my system and its working here.
Upvotes: -1
Reputation: 1951
Check for the turbolinks load event like:
document.addEventListener("turbolinks:load", function() {
$("#hide").click(function(){
$("p").hide();
});
$("#show").click(function(){
$("p").show();
});
})
Upvotes: 2