2014-09-08 12 views
5

non sono in grado, per qualche motivo di passare le variabili locali alla vista spettacolo ...Passando variabili locali ad una vista dal regolatore

Nel mio controller ho semplicemente:

def show 
    render template: "books/show", :resource => "Some text" 
end 

A mio avviso I Stampa la seguente:

<h1>My local variable text: <%= resource %></h1> 

e sto ottenendo il seguente messaggio:

undefined local variable or method `resource' for #<#<Class:0x00000118ebce90>:0x00000118ec3498> 

Ho provato sintassi seguenti nel controller:

render template: "books/show", locals: { resource: "Some text" } 
render template: "books/show", locals: { resource => "Some text" } 
render template: "books/show", :locals => { resource: "Some text" } 
render template: "books/show", :locals => { resource => "Some text" } 

senza alcuna fortuna ...

qualche indizio?

Grazie!

+0

Perché è necessario passare variabili locali anziché variabili di istanza? Suppongo che "Some Text" sia un segnaposto perché altrimenti sarebbe più sensato che questo fosse nella vista. Passo le persone del posto ai partial ma le variabili di istanza alle viste di base. La gente del posto implica che è necessaria solo a livello locale e può essere ripulita in seguito. Altrimenti ecco i miei 2 secondi di [Googling your question] (http://thepugautomatic.com/2013/05/locals/) – engineersmnky

+0

No, è più complicato di così! "Some text" è solo per illustrazione ... Sto passando oggetti diversi a seconda di dove sto chiamando il template. Per fare ciò, non ho altra scelta che aggiungere la capacità di definire la variabile locale per la vista ... – user3442206

+0

Per esempio, sto chiamando il modello da un controller o da un decoratore. Anche questo modello è usato per classi diverse in quanto sono molto simili sotto molti aspetti ... – user3442206

risposta

2

Non è possibile passare variabili locali da un controller a una vista. Quello che potresti fare è definirlo come una variabile di istanza e quindi sarebbe automaticamente disponibile nella vista.

@resource = @book 

Se si desidera passare oggetti completamente diversi, è sufficiente definire tali variabili di istanza in modo diverso.

+1

In realtà è possibile passare le variabili locali dal controller a una vista. La definizione delle variabili di istanza è un modo comune ma non l'unico. – silverdr

+0

@silverdr Mi piacerebbe vedere una dimostrazione di questo. –

+1

Sicuro. Un esempio funzionante è nella mia risposta deeeeeep di seguito :-) Per aggiungere a questo - anche le cosiddette "best practice di Rails" si lamentano di utilizzare le variabili di istanza nelle viste anziché le variabili locali. In realtà non sono d'accordo e credo che le variabili di istanza abbiano il loro posto valido nelle opinioni, ma se qualcuno vuole rispettare i loro consigli, è sicuramente possibile passare variabili locali. – silverdr

4

penso che dovrebbe essere come

render 'books/show', :locals => {:resource => 'Some text'}

Funziona per me

+1

Sembra che i locali lavorino solo con i partial ... – Sean

1

Passaggio di dati dal Controllore alla Vista

Ecco una classe NovelController, per essere messo in app/ controllers/novel_controller.rb.

class NovelController < ApplicationController 
     def index 
     @title = 'Shattered View: A Novel on Rails' 
     end 
end 

Poiché questo è il controller Novel e l'azione index, la vista corrispondente è in app/views/novel/index.html.erb

<h1><%= @title %></h1> 

uscita:

Shattered View: A Novel on Rails 

La vista viene interpretato dopo NovelController#index viene eseguito. Ecco ciò che la vista può e non può accedere:

  • Si può accedere alle variabili di istanza @title, perché sono stati definiti sull'oggetto NovelController per il momento NovelController#index finiture in esecuzione.
  • Può richiamare i metodi di istanza delle variabili di istanza @title.
3

Per prima cosa mi chiedo perché è necessario il template:. Sei su Rails 2.x? In caso contrario, l'opzione :template non è più necessaria.Dovreste essere in grado di andare d'accordo bene con appena

render "books/show"

In secondo luogo avete bisogno di specificare il modello? Qual è il controller da cui vuoi eseguire il rendering? Se questo è BooksController, allora non è necessario il percorso del modello o, il che rende la linea di essere solo

render

Questo è senza le variabili ancora. Ora, ho appena controllato, e un semplice:

render locals: { resource: "Some text" }

così come:

render 'books/show', locals: { resource: "Some text" }

funziona per me più che bene. Forse le versioni precedenti di Rails trattavano "risorse" come una sorta di parola chiave? Non so, ma sopra Worksforme ™ in entrambe le forme.

0

È possibile ottenere come segue. Tutto dà lo stesso risultato. Ecco il link reference.

render action: :show , locals: { resource: "Some text"} 
render :show , locals: { resource: "Some text"} 
render locals: { resource: "Some text"}