TL; Versión DR de la pregunta

¿Es posible pasar una cadena a un parcial y hacer que el parcial use esa cadena en una instrucción if o en un caso de cambio?

¿Estoy rompiendo alguna regla valiosa de Rails al hacer que las vistas se comuniquen directamente entre sí?

Versión larga con fragmentos de código

Creo que es seguro decir que en este momento he leído todas las publicaciones sobre cómo pasar una variable local. Todavía tengo problemas para lograr esto. Soy muy nuevo en rieles, como ... 1 semana de aprendizaje, así que lo que estoy tratando de hacer podría ser completamente incorrecto.

De todos modos, lo tengo configurado para que cuando un usuario haga clic en un enlace en la barra de navegación, se cargue un modal de arranque con el formulario correcto dentro. He configurado cada formulario único como su propio parcial para poder colocarlo allí donde sea necesario y también configuré el modal como parcial. Estoy tratando de seguir este método DRY y hacerlo de modo que en el parcial modal tenga una lógica if / else o switch que solo cargue la forma correcta en función de lo que le pase el enlace.

Parcial modal:

<!-- 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 parcial:

<%= 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>

La vista principal de esta página:

<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>

Ahora, el enlace "Nuevo cliente agregado" es la parte que me está dando más problemas. Probé todas las combinaciones diferentes proporcionadas en línea, pero siempre parece basarse en la idea de trabajar con un objeto o algo de la base de datos. La cosa es que solo estoy tratando de cargar una página diferente basada en el botón seleccionado mientras uso el mismo parcial modal.

Link_to Ejemplos que he probado:

<%= 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' %>

Hay más, pero he eliminado tantas líneas de código en este punto que las he perdido. Algunos incluyen el uso de link_to con: parciales y: locales

0
Ethan Orcutt 13 dic. 2016 a las 21:28

2 respuestas

La mejor respuesta

Está mezclando algunos conceptos bastante diferentes y probablemente debería entender los conceptos básicos antes de intentar esta tarea.

Para pasar una variable entre solicitudes, usaría params. Esto puede ser en forma de segmento de URL, la cadena de consulta o el cuerpo de la solicitud (mediante un formulario). Dado que una variable en el servidor no persiste entre solicitudes, no puede pasar variables locales a link_to y no tengo idea de dónde sacó la idea de que funcionaría.

locals por otro lado es una forma de asignar una variable local en el contexto de representación de un parcial. Puede usar esto para pasar cualquier tipo de datos.

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

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

<% elsef a ==  2 %>

<% end %>

Pero volvamos a tu pregunta. Hay algunas formas diferentes de resolverlo.

La primera es incluir todos los formularios en la página y luego intercambiar el contenido del modal según lo que el usuario haga clic. Puede hacer esto utilizando enlaces de anclaje HTML antiguos en lugar de link_to y creando un detector de JavaScript que intercepte el evento de clic y en su lugar abra el destino del enlace en un modal.

El segundo es usar una solicitud ajax para obtener la versión renderizada de un archivo. Luego, abriría un parcial con el contenido obtenido de la solicitud ajax.

Esto se puede resolver de varias formas, por ejemplo, usando jQuery.load o los componentes rails ujs y creando una plantilla .js.erb.

0
max 13 dic. 2016 a las 19:19

Como comentaron algunas personas, la opción "parcial" es para el método de render, no para el link_to.

Algo como esto probablemente funcionaría para usted:

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

Sugerencia no relacionada:

Evite a toda costa configurar variables de instancia en la vista. En este caso, probablemente debería haberlo configurado en el controlador :)

0
Victor A.M. 13 dic. 2016 a las 19:14