2016-12-13 5 views
0

Je suis un débutant RoR essayant de créer un formulaire. Je souhaite pouvoir enregistrer toutes les valeurs du formulaire et exécuter une requête de recherche sur ma base de données en fonction des valeurs avant de renvoyer une vue mise à jour. Je suis sur les rails 4, et créé un tableau de cases à cocher en utilisant ce tutoriel: https://www.youtube.com/watch?v=c2qwV0B9yfU, mais les cases à cocher ne s'affichent pas. Je n'arrive pas à trouver une solution par moi-même, alors j'espérais de l'aide.Ruby on rails 4 check_box_tag n'apparaît pas dans le formulaire

C'est ma forme: enter image description here

Ceci est mon form.html.erb. Il est enregistré dans les vues/page d'accueil/form.html.erb

<div class="row"> 
    <div class="col-md-6 col-md-offset-3"> 
    <%= form_for(@homepage, url: form_path) do |f| %> 
    # <%= render 'shared/error_messages_form' %> 
     <%= f.label :dname, "Dish Name" %> 
     <%= f.text_field :d_name %> 

     <%= f.label :rname, "Restaurant Name" %> 
     <%= f.text_field :r_name %> 

    <div class="diet"> 
     <%= f.label :violation_name, "Dietary Restriction0.5" %> 
     <%= hidden_field_tag "homepage[dietaryviolation_ids][]", nil %> 
     <% Dietaryviolation.all.each do |dietaryviolation| %> 

      <%= check_box_tag "homepage[dietaryviolation_ids][]", dietaryviolation.id, @homepage.dietaryviolation_ids.include?(dietaryviolation.diet), id: dom_id(dietaryviolation) %> 
      <%= label_tag dom_id(dietaryviolation), dietaryviolation.diet %><br> 
      <% end %> 
    </div> 

    <div class="food"> 
     <%= f.label :food_name, "Restaurant Cuisine0.5" %> 
     <%= hidden_field_tag "homepage[restaurantcuisine_ids][]", nil %> 
     <% @restaurantcuisines.each do |restaurantcuisine| %> 
      <%= f.check_box "homepage[restaurantcuisine_ids][]", restaurantcuisine.id, @homepage.restaurantcuisine_ids.include?(restaurantcuisine.diet), id: dom_id(restaurantcuisine) %> 
      <%= label_tag dom_id(restaurantcuisine), restaurantcuisine.diet %><br> 
      <% end %> 
    </div> 

    <%= f.label "Calories"%> 
    <%= form_for :homepage, url: form_path do |cal| %>  
     <div id="calorie_slider"></div> 
     <%= cal.hidden_field :c_min %> 
     <%= cal.hidden_field :c_max %> 
    <% end %> 

    <%= f.label "Rating"%> 
    <%= form_for :homepage, url: form_path do |rate| %> 
     <div id="rating_slider"></div> 
     <%= rate.hidden_field :r_min %> 
     <%= rate.hidden_field :r_max %> 
    <% end %> 

    <%= f.label "Price Range"%> 
    <%= form_for :homepage, url: form_path do |price| %> 
     <div id="price_slider"></div> 
     <%= price.hidden_field :p_min %> 
     <%= price.hidden_field :p_max %> 
    <% end %> 

<%= f.submit "Filter my shiz!", class: "btn btn-primary" %> 

<% end %> 

Le code HTML correspondant pour la section check_box_tag ressemble à ceci:

<div class="diet"> 
 
     <label for="homepage_violation_name">Dietary Restriction0.5</label> 
 
     <input type="hidden" name="homepage[dietaryviolation_ids][]" id="homepage_dietaryviolation_ids_" /> 
 
</div> 
 

 
<div class="food"> 
 
     <label for="homepage_food_name">Restaurant Cuisine0.5</label> 
 
     <input type="hidden" name="homepage[restaurantcuisine_ids][]" id="homepage_restaurantcuisine_ids_" /> 
 
</div>

Il semble à manquer complètement les cases à cocher, donc je pense que c'est là que l'erreur est, mais je ne sais pas pourquoi il est :(passe

Le contrôleur correspondant est homepage_controller.rb

class HomepageController < ApplicationController 

    def index 
    end 

    def new 
     @homepage = Homepage.new 
    end 

    def form 
    @restaurantcuisines = Restaurantcuisine.select(:cuisine).distinct 
    @dietaryviolations = Dietaryviolation.select(:diet).distinct 
    @homepage = Homepage.new(homepage_params) 
    end 

    def filter 
    end 

    private 

    def homepage_params 
    params.permit(:d_name, :r_name, :c_min, :c_max, :r_min, :r_max, :p_min, :p_max, { :restaurantcuisine_ids => [] }, { :dietaryviolation_ids => [] }) 
    end 

end 

J'ai créé des fonctions de CRUD pour restaurantscuisine_controller et dietaryviolations_controller, mais rien d'autre.

Le modèle de page d'accueil est lié au modèle diététique de la diététique et au modèle de restaurantscuisine à travers une relation de has-and-belongs-to-many. Les relations sont rassemblées dans des tables de jointure appelées dietaryviolations_homepages et homepages_restaurantscuisine. Je n'ai rien d'autre dans les modèles à l'exception de la ligne has_and_belongs_to_many et des contrôles de validation Accueil

class Homepage < ActiveRecord::Base 

has_and_belongs_to_many :restaurantcuisine 
has_and_belongs_to_many :dietaryviolation 

before_save { self.d_name = d_name.downcase } if ':d_name.present?' 
before_save { self.r_name = r_name.downcase } if ':r_name.present?' 

validates :c_max, numericality: { only_integer: true, less_than_or_equal_to: 5000, greater_than_or_equal_to: :c_min } 
validates :c_min, numericality: { only_integer: true, less_than_or_equal_to: :c_max, greater_than_or_equal_to: 0 } 

validates :r_max, numericality: { only_integer: true, less_than_or_equal_to: 5, greater_than_or_equal_to: :r_min } 
validates :r_min, numericality: { only_integer: true, less_than_or_equal_to: :r_max, greater_than_or_equal_to: 0 } 

validates :p_max, numericality: { only_integer: true, less_than_or_equal_to: 50, greater_than_or_equal_to: :p_min } 
validates :p_min, numericality: { only_integer: true, less_than_or_equal_to: :p_max, greater_than_or_equal_to: 0 } 

validates_associated :restaurantecuisine 
validates_associated :dietaryviolation 

end 

Mon fichier application.scss a les lignes suivantes:

*= require jquery-ui 
 
*= require bootstrap-slider 
 
*= require_tree . 
 
*= require_self 
 
*/ 
 

 
@import "bootstrap-sprockets" 
 
@import "bootstrap" 
 
@import url(http://www.w3schools.com/lib/w3.css)

Mon fichier application.js contient les lignes suivantes:

//= require jquery 
 
//= require jquery_ujs 
 
//= require jquery-ui 
 
//= require bootstrap 
 
//= require bootstrap-sprockets 
 
//= require bootstrap-slider 
 
//= require turbolinks 
 
//= require_tree .

Un conseil serait apprécié! J'ai essayé plusieurs façons de faire fonctionner les cases à cocher, notamment en utilisant collection_check_box mais rien ne semble fonctionner.

Répondre

0

Essayez de faire cela à la place,

<%= f.collection_check_boxes :foo, Foo.all, :id, :name do |cb| %> 
    <% cb.label(class: "checkbox-inline input_checkbox") {cb.check_box(class: "checkbox") + cb.text} %> 
<% end %> 

Ne remplacez :foo avec les noms des objets appropriés. Les classes sont destinées à css qui peut être ignoré.

Aussi, juste une petite explication de ce qui se passe.

collection_check_boxes(object, method, value_method, text_method)

Comme pris de here, nous avons donc l'objet :foo, le procédé étant Foo.all, semblable à quand vous faites <% @restaurantcuisines.each do |restaurantcuisine| %>. Ensuite, nous avons :id qui est le value_method et enfin notre label utilise text_method qui est :name. Notez, bien sûr, si votre modèle n'a pas une colonne :name, vous ne pouvez évidemment pas utiliser :name pour votre text_method.

Je voudrais également noter, dans les formes que ce soit text_area, etc, ce sera input_method :object.

+0

J'ai mis: dietaryviolation pour: foo, @dietaryviolations pour Foo.all, et: régime pour: id et: nom car il n'y a pas une colonne: id ou: name (seulement une colonne de régime qui est essentiellement nom , et une colonne d'ingrédient qui est l'ingrédient spécifique qui viole la contrainte de régime), mais il ne montre pas encore. – tintin

+0

Le ': id' est définitivement là. Toutes les tables dans les rails auraient automatiquement une colonne 'id' à coup sûr. Essayez de l'ajouter et de voir si cela fonctionne. – angkiki