0

I'm trying to figure out how to incorporate jQuery and javascript in my rails 4 app. I'm struggling.

I have each of these gems in my gem file:

gem 'sass-rails', '~> 5.0'
gem 'bootstrap-sass', '~> 3.3.5.1'
gem 'jquery-rails'
gem 'jquery-ui-rails'

I have a number of conflicts (the last 5 of my questions and most recent bounty all relate to these). See attached links:

http://stackoverflow.com/questions/36734854/rails-4-jquery-conflicts-with-javascript
http://stackoverflow.com/questions/36832276/rails-4-jquery-conflicts-and-function-error
http://stackoverflow.com/questions/36831987/rails-4-jquery-to-hide-initially-then-toggle-with-click
http://stackoverflow.com/questions/36614651/rails-4-conditional-js-with-dependent-fields-rails

In order to try to work around one aspect of these problems, I removed the dependent-rails gem and am trying to write my own function to hide a section of my projects/form until a question in that form is answered by checking a box (so its value is true).

I currently have a projects.js file in my app/assets/javascripts folder. It has:

(function($){

$(document).ready(function() {
    $("#check_project_milestones").hide()
});

})(jQuery);

While this formulation (the first and last line are new) does stop one error (which before including the first and last line said "Uncaught TypeError: $ is not a function(anonymous function) @ projects.self-9c019ba….js?"), it doesnt actually work to hide the text inside the id tag 'check_project_milestones'.

The form has:

<%= f.input :has_milestones, as: :boolean, boolean_style: :inline, :label => 'Does this research project have identifiable milestones or decision points?', id: 'check_project_milestones' %>

                        <%= content_tag :div,  data: {'checkbox-id': 'check_project_milestones', 'checkbox-value': 'true' } do %>

                            <div class="intpol2">
                              Milestones
                            </div>
                            <%= f.simple_fields_for :milestones do |f| %>

                              <%= render 'milestones/milestone_fields', f: f %>
                            <% end %>
                        <% end %>


                      <div class="row">

                        <div class="col-md-6">

                           <%= link_to_add_association 'Add a milestone', f, :milestones, partial: 'milestones/milestone_fields' %>

                        </div>
                      </div>  

My application.js has:

//= require jquery
//= require jquery-ui
//= require bootstrap-sprockets
//= require jquery_ujs
//= require html.sortable
//= require disqus_rails
//= require moment
//= require bootstrap-datetimepicker
//= require pickers
//= require main
//= require hammer.min
//= require jquery.animate-enhanced.min
//= require jquery.countTo
//= require jquery.easing.1.3
//= require jquery.fitvids
//= require jquery.magnific-popup.min
//= require jquery.parallax-1.1.3
//= require jquery.properload
//= require jquery.shuffle.modernizr.min
//= require jquery.sudoSlider.min
//= require jquery.superslides.min
//= require masonry.pkgd.min
//= require rotaterator
//= require smoothscrolljs
//= require waypoints.min
//= require wow.min
//= require gmaps/google
//= require chosen-jquery
//= require cocoon
//= require imagesloaded.pkgd.min
//= require isotope.pkgd.min
//= require jquery.counterup.min
//= require jquery.pjax
//= require custom.js
//= require slider
//= require underscore
//= require bootstrap-slider
//= require_tree .

Can anyone see what I have done wrong?

THE SECOND PART OF THE FORM

<div id="check_project_milestones" class="hidden">
                                  <div class="intpol2"> Milestones </div>


<div class="nested-fields">
    <div class="container-fluid">
        <div class="form-inputs">

            <div class="row">
                <div class="col-md-7">
                    <div class="form-group string optional project_milestones_title"><label class="string optional control-label" for="project_milestones_attributes_0_title">Give this milestone a title</label><input class="string optional form-control" type="text" name="project[milestones_attributes][0][title]" id="project_milestones_attributes_0_title"></div> 
                </div>

                <div class="col-md-4 col-md-offset-1">
                    <div class="form-group date optional project_milestones_completion_date"><label class="date optional control-label" for="project_milestones_attributes_0_completion_date_1i">When do you expect to reach this milestone?</label><div class="form-inline"><select id="project_milestones_attributes_0_completion_date_1i" name="project[milestones_attributes][0][completion_date(1i)]" class="date optional form-control">
<option value="2011">2011</option>
<option value="2012">2012</option>
<option value="2013">2013</option>
<option value="2014">2014</option>
<option value="2015">2015</option>
<option value="2016" selected="selected">2016</option>
<option value="2017">2017</option>
<option value="2018">2018</option>
<option value="2019">2019</option>
<option value="2020">2020</option>
<option value="2021">2021</option>
</select>
<select id="project_milestones_attributes_0_completion_date_2i" name="project[milestones_attributes][0][completion_date(2i)]" class="date optional form-control">
<option value="1">January</option>
<option value="2">February</option>
<option value="3">March</option>
<option value="4" selected="selected">April</option>
<option value="5">May</option>
<option value="6">June</option>
<option value="7">July</option>
<option value="8">August</option>
<option value="9">September</option>
<option value="10">October</option>
<option value="11">November</option>
<option value="12">December</option>
</select>
<select id="project_milestones_attributes_0_completion_date_3i" name="project[milestones_attributes][0][completion_date(3i)]" class="date optional form-control">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
<option value="25">25</option>
<option value="26" selected="selected">26</option>
<option value="27">27</option>
<option value="28">28</option>
<option value="29">29</option>
<option value="30">30</option>
<option value="31">31</option>
</select>
</div></div> 
                </div>
            </div>  
            <div class="row">

                <div class="col-md-10">
                    <div class="form-group text optional project_milestones_description"><label class="text optional control-label" for="project_milestones_attributes_0_description">Describe what will be required to complete it</label><textarea class="text optional form-control" name="project[milestones_attributes][0][description]" id="project_milestones_attributes_0_description"></textarea></div> 
                </div>
            </div>
            <div class="row">   
                <div class="col-md-10">
                    <div class="form-group text optional project_milestones_decision"><label class="text optional control-label" for="project_milestones_attributes_0_decision">Will project parties make a decision as to whether to take the project further at this time? If so, what are the relevant considerations?</label><textarea class="text optional form-control" name="project[milestones_attributes][0][decision]" id="project_milestones_attributes_0_decision"></textarea></div> 
                </div>              
            </div>

        </div>
    </div>
</div>  
                               <br>

                               <div class="row">
                                  <div class="col-md-6">
                                     <a class="add_fields" data-association="milestone" data-associations="milestones" data-association-insertion-template="
<div class=&quot;nested-fields&quot;>
    <div class=&quot;container-fluid&quot;>
        <div class=&quot;form-inputs&quot;>

            <div class=&quot;row&quot;>
                <div class=&quot;col-md-7&quot;>
                    <div class=&quot;form-group string optional project_milestones_title&quot;><label class=&quot;string optional control-label&quot; for=&quot;project_milestones_attributes_new_milestones_title&quot;>Give this milestone a title</label><input class=&quot;string optional form-control&quot; type=&quot;text&quot; name=&quot;project[milestones_attributes][new_milestones][title]&quot; id=&quot;project_milestones_attributes_new_milestones_title&quot; /></div> 
                </div>

                <div class=&quot;col-md-4 col-md-offset-1&quot;>
                    <div class=&quot;form-group date optional project_milestones_completion_date&quot;><label class=&quot;date optional control-label&quot; for=&quot;project_milestones_attributes_new_milestones_completion_date_1i&quot;>When do you expect to reach this milestone?</label><div class=&quot;form-inline&quot;><select id=&quot;project_milestones_attributes_new_milestones_completion_date_1i&quot; name=&quot;project[milestones_attributes][new_milestones][completion_date(1i)]&quot; class=&quot;date optional form-control&quot;>
<option value=&quot;2011&quot;>2011</option>
<option value=&quot;2012&quot;>2012</option>
<option value=&quot;2013&quot;>2013</option>
<option value=&quot;2014&quot;>2014</option>
<option value=&quot;2015&quot;>2015</option>
<option value=&quot;2016&quot; selected=&quot;selected&quot;>2016</option>
<option value=&quot;2017&quot;>2017</option>
<option value=&quot;2018&quot;>2018</option>
<option value=&quot;2019&quot;>2019</option>
<option value=&quot;2020&quot;>2020</option>
<option value=&quot;2021&quot;>2021</option>
</select>
<select id=&quot;project_milestones_attributes_new_milestones_completion_date_2i&quot; name=&quot;project[milestones_attributes][new_milestones][completion_date(2i)]&quot; class=&quot;date optional form-control&quot;>
<option value=&quot;1&quot;>January</option>
<option value=&quot;2&quot;>February</option>
<option value=&quot;3&quot;>March</option>
<option value=&quot;4&quot; selected=&quot;selected&quot;>April</option>
<option value=&quot;5&quot;>May</option>
<option value=&quot;6&quot;>June</option>
<option value=&quot;7&quot;>July</option>
<option value=&quot;8&quot;>August</option>
<option value=&quot;9&quot;>September</option>
<option value=&quot;10&quot;>October</option>
<option value=&quot;11&quot;>November</option>
<option value=&quot;12&quot;>December</option>
</select>
<select id=&quot;project_milestones_attributes_new_milestones_completion_date_3i&quot; name=&quot;project[milestones_attributes][new_milestones][completion_date(3i)]&quot; class=&quot;date optional form-control&quot;>
<option value=&quot;1&quot;>1</option>
<option value=&quot;2&quot;>2</option>
<option value=&quot;3&quot;>3</option>
<option value=&quot;4&quot;>4</option>
<option value=&quot;5&quot;>5</option>
<option value=&quot;6&quot;>6</option>
<option value=&quot;7&quot;>7</option>
<option value=&quot;8&quot;>8</option>
<option value=&quot;9&quot;>9</option>
<option value=&quot;10&quot;>10</option>
<option value=&quot;11&quot;>11</option>
<option value=&quot;12&quot;>12</option>
<option value=&quot;13&quot;>13</option>
<option value=&quot;14&quot;>14</option>
<option value=&quot;15&quot;>15</option>
<option value=&quot;16&quot;>16</option>
<option value=&quot;17&quot;>17</option>
<option value=&quot;18&quot;>18</option>
<option value=&quot;19&quot;>19</option>
<option value=&quot;20&quot;>20</option>
<option value=&quot;21&quot;>21</option>
<option value=&quot;22&quot;>22</option>
<option value=&quot;23&quot;>23</option>
<option value=&quot;24&quot;>24</option>
<option value=&quot;25&quot;>25</option>
<option value=&quot;26&quot; selected=&quot;selected&quot;>26</option>
<option value=&quot;27&quot;>27</option>
<option value=&quot;28&quot;>28</option>
<option value=&quot;29&quot;>29</option>
<option value=&quot;30&quot;>30</option>
<option value=&quot;31&quot;>31</option>
</select>
</div></div> 
                </div>
            </div>  
            <div class=&quot;row&quot;>

                <div class=&quot;col-md-10&quot;>
                    <div class=&quot;form-group text optional project_milestones_description&quot;><label class=&quot;text optional control-label&quot; for=&quot;project_milestones_attributes_new_milestones_description&quot;>Describe what will be required to complete it</label><textarea class=&quot;text optional form-control&quot; name=&quot;project[milestones_attributes][new_milestones][description]&quot; id=&quot;project_milestones_attributes_new_milestones_description&quot;>
</textarea></div> 
                </div>
            </div>
            <div class=&quot;row&quot;> 
                <div class=&quot;col-md-10&quot;>
                    <div class=&quot;form-group text optional project_milestones_decision&quot;><label class=&quot;text optional control-label&quot; for=&quot;project_milestones_attributes_new_milestones_decision&quot;>Will project parties make a decision as to whether to take the project further at this time? If so, what are the relevant considerations?</label><textarea class=&quot;text optional form-control&quot; name=&quot;project[milestones_attributes][new_milestones][decision]&quot; id=&quot;project_milestones_attributes_new_milestones_decision&quot;>
</textarea></div> 
                </div>              
            </div>

        </div>
    </div>
</div>  " href="#">Add a milestone</a>

                                  </div>
                               </div>

                            </div>

CURRENT STATE OF FORM <%= f.input :has_milestones, as: :boolean, boolean_style: :inline, :label => 'Does this research project have identifiable milestones or decision points?', id: 'project_has_milestones_form' %>

                               <div id="check_project_milestones" class="hidden">
                                  <div class="intpol2"> Milestones </div>
                                  <%= f.simple_fields_for :milestones do |f| %>
                                     <%= render 'milestones/milestone_fields', f: f %>
                                  <% end %>
                               <br>

                               <div class="row">
                                  <div class="col-md-6">
                                     <%= link_to_add_association 'Add a milestone', f, :milestones, partial: 'milestones/milestone_fields' %>

                                  </div>
                               </div>

                            </div>
Mel
  • 2,481
  • 26
  • 113
  • 273
  • try inserting `jQuery.noConflict();` before `(function( $ ) {` – Малъ Скрылевъ Apr 26 '16 at 06:46
  • it doesnt give an error message in the console, but like the above problem, the hide function doesnt work – Mel Apr 26 '16 at 07:06
  • try to replace with `jQuery("#check_project_milestones").hide();` – Малъ Скрылевъ Apr 26 '16 at 07:08
  • that gives the same outcome as the above attempts (no console error, but the hide function doesnt work). – Mel Apr 26 '16 at 08:06
  • how did you find out that the fucntiuon isn't work? – Малъ Скрылевъ Apr 26 '16 at 08:46
  • I load the page, and the content which is supposed to be hidden is showing. When I click the check box that's supposed to show (it's meant to be hidden initially - although it isn't), nothing happens. The whole form is showing constantly – Mel Apr 26 '16 at 08:48
  • so just declare hidden content directly in a view by setting it: `style='display: nothing;'` or `class=hidden` in case of usage bootstrap – Малъ Скрылевъ Apr 26 '16 at 08:49
  • but i want to toggle on/off with click of the first checkbox – Mel Apr 26 '16 at 08:57
  • make sure that there is the specified object with id `#check_project_milestones`. Im not sure that it exists – Малъ Скрылевъ Apr 26 '16 at 08:59
  • What is a 'specified object'? How do I make sure there is one. I copied the form above. The first question has the 'id' defined. The second block is the content tag wiht the matching id – Mel Apr 26 '16 at 09:05
  • open the page source in a browser and look into it – Малъ Скрылевъ Apr 26 '16 at 09:05
  • please can you explain what I"m supposed to look for? I don't understand what you mean – Mel Apr 26 '16 at 09:07
  • can you open the page in a browser, right mouse click on the visible control you wish to be hidden, then inspect (in firefox with firebug), copy its body and paste here – Малъ Скрылевъ Apr 26 '16 at 09:08
  • It shows everything in the form set out in my post starting from the second div - at this line:
    – Mel Apr 26 '16 at 09:13
  • that is the problem: you should create div with `id`, not `data-checkbox-id` key. if it is toggle, but where is the div with id="check_project_milestones" – Малъ Скрылевъ Apr 26 '16 at 09:14
  • So your suggestion is to replace: <%= content_tag :div, data: {'checkbox-id': 'check_project_milestones', 'checkbox-value': 'true' } do %> with <%= content_tag :div id: 'check_project_milestones', 'checkbox-value': 'true' } do %>??? – Mel Apr 26 '16 at 09:17
  • The first question in the form has the id: <%= f.input :has_milestones, as: :boolean, boolean_style: :inline, :label => 'Does this research project have identifiable milestones or decision points?', id: 'check_project_milestones' %> – Mel Apr 26 '16 at 09:17
  • I dont know what field do you want to hide/show, and by clicking to which field. please elaborate it in question (not here in comments) with example code parts – Малъ Скрылевъ Apr 26 '16 at 09:28
  • The first question is a checkbox. When it is clicked I want to display all the rest of the form – Mel Apr 26 '16 at 09:30

1 Answers1

0

I propose you to do like follows:

<%= f.input :has_milestones, as: :boolean, boolean_style: :inline, :label => 'Does this research project have identifiable milestones or decision points?' %>

   <div class="content hidden">
      <div class="intpol2"> Milestones </div>
      <%= f.simple_fields_for :milestones do |f| %>
         <%= render 'milestones/milestone_fields', f: f %>
      <%- end %>
   </div>

   <div class="row">
      <div class="col-md-6">
         <%= link_to_add_association 'Add a milestone', f, :milestones, partial: 'milestones/milestone_fields' %>
      </div>
   </div>

<%- end %>

Defice form as a checkbox with id, and define the rest of form with another id. Then define click handle on checkbox and just toggle add/remove hidden class part from the rest form div.

$(document).ready(function() {
   $("#project_has_milestones").on('click', function() {
      if ($(this)[0].checked) {
          $('#project_has_milestones .content').addClass('hidden');
      } else {
          $('#project_has_milestones .content').removeClass('hidden');
      }
   });
});

In case of jQuery name conflict you should replace all the $ with jQuery name.

Малъ Скрылевъ
  • 16,187
  • 5
  • 56
  • 69
  • Hi - I tried this, the second part of the form is hidden, but it doesn't show when you tick the first checkbox – Mel Apr 26 '16 at 10:04
  • The console shows this error: projects.self-a9d9c53….js?body=1:1 Uncaught TypeError: $ is not a function(anonymous function) @ projects.self-a9d9c53….js?body=1:1 main.self-5888479….js?body=1:316 – Mel Apr 26 '16 at 10:04
  • I can't figure out how to copy from the code inspector – Mel Apr 26 '16 at 10:18
  • which bit did you change? – Mel Apr 26 '16 at 10:18
  • I replaced all "$" with jQuery - the second part of the form starts hidden but it doesnt show when you check the first box – Mel Apr 26 '16 at 10:20
  • jQuery(document).ready(function() { jQuery("#check_project_milestones_form").on('click', function() { if (jQuery(this)[0].checked) { jQuery('#check_project_milestones').addClass('hidden'); } else { jQuery('#check_project_milestones').removeClass('hidden'); } }); }); – Mel Apr 26 '16 at 10:20
  • @user2860931 added a comment to replace $ with jQuery – Малъ Скрылевъ Apr 26 '16 at 10:21
  • @user2860931 provide the resutled html code of the form – Малъ Скрылевъ Apr 26 '16 at 10:21
  • Hi - I don't know how to copy it from the code inspector – Mel Apr 26 '16 at 10:23
  • – Mel Apr 26 '16 at 10:24
  • @user2860931 copy with form tag – Малъ Скрылевъ Apr 26 '16 at 10:24
  • i copy the rest into the post above - it's too long for this box – Mel Apr 26 '16 at 10:24
  • @user2860931 `id="project_has_milestones"` should be `id="project_has_milestones_form"` – Малъ Скрылевъ Apr 26 '16 at 10:25
  • THE FORM IS LIKE THIS: <%= f.input :has_milestones, as: :boolean, boolean_style: :inline, :label => 'Does this research project have identifiable milestones or decision points?', id: 'check_project_milestones_form' %> – Mel Apr 26 '16 at 10:27
  • Which 'id' should I change? – Mel Apr 26 '16 at 10:28
  • @user2860931 checkboxes id you should change – Малъ Скрылевъ Apr 26 '16 at 10:28
  • I added the current state of the form to the post above. I still have the same problem. The first check box input shows, but when it's ticked, the rest of the form should show - but it doesnt – Mel Apr 26 '16 at 10:32
  • Let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/110250/discussion-between---and-user2860931). – Малъ Скрылевъ Apr 26 '16 at 10:34