Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Rails - layout e nil error

    Salve sono nuovo sia del forum che di Rails

    ho un problema in un applicazione che prorpio non riesco a risolvere

    l'applicazione ha 2 modelli con scaffold e relativi controller
    Recipe e Category ed hanno una relazione uno a molti

    c'è un layout con dell' html (layout a 3 colonne + header) che si chiama recipe.html.erb

    fin qua tutto funziona

    l'app si muove nel div centrale dove c'è <%= yield %>

    il problema nasce quando voglio mettere una lista nella sidebar di dx

    con le conoscienze che ho al momento la cosa più logica che dovrei fare è mettere tale codice nel div della sidebar

    codice:
    <div id="sidebar1">
    <% for recipe in @recipes %>
    <ul>[*]<%= link_to recipe.title, :action => "show", :id => recipe.id%>[/list]
    <% end %>
    </div>
    la lista appare ma quando clicco su uno dei link (ed anche sul link edit dello scaffold ) appare:

    NoMethodError in Recipes#show

    You have a nil object when you didn't expect it!
    You might have expected an instance of Array.
    The error occurred while evaluating nil.each

    non capisco come posso fare a ottenere la semplice lista come per il controller recipes action index

    riuscite a darmi qualche dritta?

    grazie

  2. #2
    Due consigli:

    1. non usare for ma usa il metodo .each. E' più "rubista".
    2. nel tuo caso è appropriato l'uso di content_for. Infatti, così come hai organizzato il codice stai creando una dipendenza tra il contenuto di una specifica action ed il layout globale. Il che è errato e può comportare problemi, come tu stesso hai notato.

  3. #3
    grazie per la risposta

    difatto non ho ancora provato il metodo content_for ma intendo testaro quanto prima...

    invece ho provato con l'utilizzo di render artial

    il che pero richiede che il codice html cioè la suddivisione div ecc avvenga nella view il che mi costringerebbe a ripetere il codice in ogni view il che non è molto dry

    provo con il metodo content for

    grazie

  4. #4
    content_for va bene per gestire contenuti dinamici nella sidebar

    content_for si porta dietro le variabili?

    qual'è il metodo piu dry che voi sappiate per avere una sidebar con contenuti dinamici che cambia di controller in controller???

    grazie per la disponibilità

  5. #5
    qual'è il metodo piu dry che voi sappiate per avere una sidebar con contenuti dinamici che cambia di controller in controller???
    Esattamente quello che ti ho detto.

    Predisponi uno slot nel layout, ad esempio :sidebar, dopo di che lo valorizzi nelle specifiche action con i contenuti che vuoi.

  6. #6
    grazie per le dritte


    finalmente ho un app con sidebar

    per conferma ti chiedo se il metodo che ho usato è corretto ti riporto gli esempi qui sotto:

    modelli: 2
    controller: 2

    posts e categories, con relazione uno a molti

    application layout

    codice:
    <div id='wrapper'>
      	<div id='header'>
        
      	</div>
      	<div id='sidebar_1'>
        	<%= yield :sidebar_1 %>
     	</div>
      	<div id='content'>
       		 <%= yield %>
     	</div>
    	<div id='sidebar_2'>
    		<%= yield :sidebar_2 %>
      	</div>
    	<div id='footer'>
        
      	</div>
     </div>
    
    </body>
    3 partial

    nelle view metto :

    codice:
    <%= render :partial => "shared/codesidebar" %>
    _codesidebar

    codice:
    <% content_for :sidebar_1 do %>
      <%= render :partial => "shared/sidebar" %>
    <% end %>
    
    <% content_for :sidebar_2 do %>
      <%= render :partial => "shared/sidebar2" %>
    <% end %>
    _sidebar

    codice:
    <div id="side_size">
    	<% @posts.each do |post| %>
    	[*]
    		<%= link_to post.category.name, :controller => "posts", :action => "show", :id => post.id %>
    	
    	<% end %>
    </div>
    Esigenza, avere un app con 2 sidebar che possano in base alla sezione del sito in cui ci si vuole dirigere, mostrare liste dinamiche di link che fanno un .find(:all, :condition => codizione voluta)

    siccome a volte mi muovo su differenti controller la sidebar non ha a disposizione la variabile locale dell' altro controller e mi da nil, ammeno che nel controller faccio un discorso di questo tipo:

    CategoriesController

    codice:
    class CategoriesController < ApplicationController
    
      def index
        @categories = Category.all
        @posts = Post.all
        end
    
      def show
        @category = Category.find(params[:id])
        @posts = Post.all
      end
    
      # GET /categories/new
      # GET /categories/new.xml
      def new
        @category = Category.new
        @posts = Post.all
        end
    
      def edit
        @category = Category.find(params[:id])
        @posts = Post.all
      end
    
      def create
        @category = Category.new(params[:category])
        @posts = Post.all
        end
    
      def update
        @category = Category.find(params[:id])
        @posts = Post.all
      end
    
    
      def destroy
        @category = Category.find(params[:id])
        @category.destroy
        @posts = Post.all
      end
    end
    facendo cosi tutti i dati risultano

    domanda? è dry tutto questo o esiste metodo migliore per farlo?
    ossia per rendere la variabile a cui fa riferimento la sidebar disponibile dove serve..

    questo mi serve per capire meglio come realizzare un portale con rails

    dove il modello è 1
    le macrocategorie sono molte
    e per ogni macrocategorie ci sono x categorie
    e per ogni categoria ci sono delle tag o tipologie di modello (a cui si fa riferimento con una voce nella tabella del modello)

    l'esigenza è che in base a dove ci si trova come categoria nella sidebar ci devono essere delle liste/link dinamiche che mi iterino il modello con le condizioni richieste...

    grazie infinite in anticipo per le dritte e i consigli

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.