3

I have an Ant show page that displays detailed information about various types of ants. On that page there are two drop downs, one for environment: [indoor, outdoor], and one for diet: [sugar, fat, protein].

When you select a param from each it renders out a product page depending on the params. However, some combinations result in nil, like a carpenter ant doesn't have a product associated with indoor, sugar.

I'm trying to get the dropdowns to populate based on whether or not a combination is nil. If someone selects indoor I'd like sugar to not appear in the next drop down if that combo doesn't exist.

So far I have I have two methods creating json arrays for only the available items:

def food_sources
  food_sources = Ant.find(params[:ant_id]).product_recommendations.where(environment: params[:environment]).map(&:diet)
  render json: food_sources.to_json
end

def environments
  environments = Ant.find(params[:ant_id]).product_recommendations.where(diet: params[:diet]).map(&:environment)
  render json: environments.to_json
end

For example, if input

http://localhost:3000/ants/27/food_sources?environment=indoor

into the browser it returns

["sugar","protein"]

bc for the ant with an id of 27 only has two options for outdoor indoor diets, instead of the possible three.

My question is how do I pass this array into my rails dropdown if someone picked the above combination?

EDIT

= form_tag ant_product_recommendations_path(@ant.id), id: 'select_box',  method: :get do |form|
  %h3 What food source are they currently feeding on?
  = select_tag :environment, options_for_select([["Select One"], "Indoor", "Outdoor"])
  %h3 
    Locate the nest by following the ants back from their food source.
    %br
    Where is the nest located?
  = select_tag :diet, options_for_select([["Select One"], "Sugar", "Fat", "Protein"])
  = submit_tag "Find Solutions", class: 'submit button' 
  = link_to 'Go Back', '/', class: 'go_back'
4
  • Why json and not an ajax call? Commented Oct 16, 2013 at 0:45
  • No reason. This was my first theory. I'm open to suggestions. Commented Oct 16, 2013 at 0:47
  • Json should be used with an Ajax call in my opinion Commented Oct 16, 2013 at 8:50
  • Is this a good or bad idea to allow open queries like this? Commented Feb 27, 2014 at 17:43

1 Answer 1

7

It seems to me like you want to dynamically populate the dropdown box, which would lend itself to an ajax call, like this:

$('#select_box').on('change', function () {
    $.ajax({
        url: "/controller/action",
        type: 'get',
        data: $(this).serialize()
    }).done(function (data) {
        change_select(data);
    });
});

function change_select(data) {
    var json = jQuery.parseJSON(data);
    var options = [];
    json.each(function (key, index) {
        options.push({text: index, value: key});
    });
    $("#select_box").replaceOptions(options);
};

This will allow you to specify the options of the dropdown, and you can use the controller in this way:

  @food_sources = Ant.find(params[:ant_id]).product_recommendations.where(environment: params[:environment]).map(&:diet)
  respond_to do |format|
    format.json { render json: @food_sources }
  end
Sign up to request clarification or add additional context in comments.

7 Comments

This code will be full of holes, but I hope it shows you what you can do to achieve your goal :)
Thanks for your post! What would the view look like. I'll post my form haml to my original post.
Okay, no need for my edit. It seems your current form is okay (if it contains the drop-down options you'd like to show people?). The appending of the dynamic options should be done by javascript, but I guess the big question would be how to make it so that the user can bring the selection back to the original. I could go into chat about it if you wanted?
I'd love to talk to you about it. if you have a moment. I apologize I was away from my desk.
Sorry! I lost the link.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.