2016-12-13 2 views
0

TL einen lokalen String in eine teilweise in Ruby passieren; DR Version der FrageWie auf Schienen

Ist es möglich, einen String in einen Teil und diese Zeichenfolge die teilweise Verwendung in einer if-Anweisung muss passieren oder Schaltergehäuse.

Bricht ich eine wertvolle Regel von Rails, indem ich die Ansichten direkt miteinander sprechen lasse?

Long Version w/Code Snippets

Ich denke, es ist sicher, dass in der Zeit an diesem Punkt sagen, die ich gelesen habe jede Nachricht gibt es darüber, wie eine lokale Variable zu übergeben. Ich habe immer noch Schwierigkeiten damit. Ich bin sehr neu in Schienen, wie .. 1 Woche des Lernens, also was ich versuche zu tun, könnte völlig inkorrekt sein.

Wie auch immer, ich habe es so eingerichtet, dass, wenn ein Benutzer auf einen Link in der Navigationsleiste klickt ein Bootstrap modal lädt mit der richtigen Form darin. Ich habe jede einzigartige Form als ihre eigene partielle festgelegt, so dass ich dort einfach hinfallen kann, wo nötig und ich habe das Modal auch als partiell eingerichtet. Ich versuche, dieser DRY-Methode zu folgen und es so zu machen, dass es im modalen Teil eine if/else- oder Switch-Logik hat, die nur die korrekte Form lädt, basierend auf dem, was die Verbindung passiert.

Modal Teil:

<!-- Modal --> 
<div class="modal fade" id="modalTemplate" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> 
    <div class="modal-dialog" role="document"> 
    <div class="modal-content"> 
     <div class="modal-header"> 
     <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> 
     <h4 class="modal-title" id="myModalLabel">Modal Template</h4> 
     </div> 
     <div class="modal-body"> 
     <% if %VARIABLE% == "%PASSED-INPUT%" %> 
      <% @customer = Customer.new %> 
      <%= render "customers/new" %> 
     <% elsif %VARIABLE% == "%PASSED-INPUT%" %> 
      --> Do something else 
     <% end %> 
     </div> 
     <div class="modal-footer"> 
     <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> 
     </div> 
    </div> 
    </div> 
</div> 

NavBar Teil:

<%= render 'layouts/modal_template' %> 

<nav class="navbar navbar-default navbar-fixed-side"> 
    <h6 class="navbar-heading">Customer Management</h6> 
    <div class="list-group"> 
    <%= link_to "Add New Customer", '#modalTemplate', 'data-toggle' => 'modal', what_to_render: "Test", class: 'list-group-item' %> 
    <%= link_to "Manage Customers", '#', class: 'list-group-item' %> 
    </div> 
    <h6 class="navbar-section-heading">Customer Status Management</h6> 
    <div class="list-group"> 
    <%= link_to "Add New Customer Status", new_customers_status_path, class: 'list-group-item' %> 
    <%= link_to "Manage Customer Statuses", '#', class: 'list-group-item' %> 
    </div> 
</nav> 

Die Hauptansicht für diese Seite:

<div class="container-fluid"> 
    <div class="row"> 
    <div class="col-sm-3 col-lg-2"> 
     <%= render 'layouts/side-nav' %> 
    </div> 
    <div class="col-sm-9 col-lg-10"> 
     <div class="well"> 
     <%= render 'test' %> 
     <%= render 'view_customers' %> 
     </div> 
    </div> 
    </div> 
</div> 

Nun ist die "Hinzugefügt Neuer Kunde" link_to der Teil das gibt mir die größte Mühe. Ich habe jede mögliche Kombination ausprobiert, die online zur Verfügung gestellt wird, aber es scheint immer auf der Idee zu basieren, mit einem Objekt oder etwas aus der Datenbank zu arbeiten. Die Sache ist, ich versuche nur eine andere Seite basierend auf der ausgewählten Schaltfläche zu laden, während ich das gleiche modale Teil benutze.

link_to Beispiele, die ich versucht habe:

<%= link_to "Add New Customer", '#modalTemplate', 'data-toggle' => 'modal', what_to_render: "Test", class: 'list-group-item' %> 
<%= link_to "Add New Customer", '#modalTemplate', 'data-toggle' => 'modal', :locals => { what_to_render: "Test" }, class: 'list-group-item' %> 

Es gibt mehr, aber ich habe so viele Zeilen Code an dieser Stelle gelöscht, dass ich sie verloren haben. Einige beinhalteten die Verwendung von link_to mit: partially und: localhosts

+0

': Einheimische' ist eine Option für 'render', nicht' link_to'. –

+0

übergeben Sie Ortsansässige, während Sie teilweise nicht in link_to Helper rendern. – Dhanabal

+0

Die 'ruby-on-rails-x' Tags sollen anzeigen, dass die Frage für eine bestimmte Version von Rails gilt. Verwenden Sie nicht mehr als eins. – max

Antwort

0

Sie mischen ein paar ziemlich unterschiedliche Konzepte und Sie sollten wahrscheinlich die Grundlagen kennen, bevor Sie diese Aufgabe versuchen.

Um eine Variable zwischen Anforderungen zu übergeben, würden Sie params verwenden. Dies kann in Form eines URL-Segments, der Abfragezeichenfolge oder des Anfragetexts (mithilfe eines Formulars) geschehen. Da eine Variable auf dem Server nicht zwischen Anforderungen persistiert, können Sie keine lokalen Variablen an link_to übergeben und ich habe keine Ahnung, woher Sie die Vorstellung haben, dass es funktionieren würde.

locals auf der anderen Seite ist ein Weg, um eine lokale Variable in die Rendering-Rahmen eines Teil zuzuweisen. Sie können damit beliebige Arten von Daten übergeben.

# foo/index.html.erb 
<%= render :bar, locals: { a: 1 } %> 

# foo/_bar.html.erb 
<% if a == 1 %> 

<% elsef a == 2 %> 

<% end %> 

Aber zurück zu Ihrer Frage. Es gibt ein paar verschiedene Möglichkeiten, es zu lösen.

Die erste besteht darin, alle Formulare auf der Seite einzufügen und dann den Inhalt des Modales basierend auf dem Klick des Benutzers zu vertauschen. Sie können dies tun, indem Sie anstelle von link_to einfache alte HTML-Anchor-Links verwenden und einen JavaScript-Listener erstellen, der das Klickereignis abfängt und stattdessen das Linkziel in einem Modal öffnet.

Die zweite besteht darin, eine Ajax-Anforderung zu verwenden, um die gerenderte Version eines Partials abzurufen. Sie würden dann einen Teil mit dem von der Ajax-Anfrage abgerufenen Inhalt öffnen.

Dies kann auf verschiedene Arten gelöst werden, indem zum Beispiel jQuery.load oder die Schienen ujs-Komponenten verwendet werden und ein .js.erb Template erstellt wird.

+0

In Ihrer Fähigkeitsstufe würde ich das Modal überspringen und es einfach als einfache alte Links implementieren, die eine andere Seite mit dem Formular rendern. Später können Sie das Modal als eine Form der progressiven Verbesserung hinzufügen. – max

+0

Danke für die Links und die Info, ich werde wahrscheinlich dem folgen, was du gesagt hast, und es einfach funktionieren lassen, bevor ich versuche, es auszuforschen. –

0

Da einige Leute comented, die "teilweise" Option ist für das Verfahren machen, nicht die link_to.

So etwas würde wahrscheinlich für Sie arbeiten:

<a href="#modalTemplate" data-toggle="modal" class="list-group-item">Add New Customer</a> 
<%= render "your/modal/partial/path" %> 

Unrelated Tipp:

Vermeiden Sie unter allen Umständen Instanzvariablen in der Ansicht festlegen. In diesem Fall sollten Sie es wahrscheinlich auf den Controller gesetzt haben :)