将所选行的参数传递给另一个Ruby视图

时间:2017-09-02 23:13:59

标签: ruby-on-rails ruby

我是红宝石的初学者。我在一个视图中有一个表,当我点击该行/项时,它应该选择所选行的ID并移动到将被触发的另一个视图,我是3天搜索并且我无法实现。

视图应该采用ID或其他参数,以便在另一个我可以处理选择带来更详细的信息>>:

<td>
 <%= link_to pedido.id, detalhes_backoffice_pedidos_path(:pedido_id => 
  pedido.id) , :onclick=>"window.open(this.href,'create_company', 
  'height=600, 
  width=600');return false;" %>            
</td>

单击请求ID时调用的视图(&#34;弹出窗口&#34;)。 Obs.:Tries以无数种方式,现在她就像这样...&gt;&gt;&gt;&gt;

<div class='container-fluid'>
 <div style='display: block;' class="col-xs-6 esquerdo ">
 <label>Num.pedido<%= pedido.id %></label> <br>
 <label>nome</label> <br>
 <label>telefone</label> <br>
</div>

控制器与GT;&GT;

class Backoffice::PedidosController < BackofficeController
.....
def detalhes
 render :layout => "application"

@pedido = params[:pedido_id]

end

在尝试了这么多之后,我完全迷失了....如果你能通过一些示例链接进行学习,那将是非常有用的!

2 个答案:

答案 0 :(得分:0)

我可能误解了这个问题,但在我看来,您只需要链接到表格中每个detalhes的{​​{1}}操作。

这是表格:

pedido

在路线中你会有这样的东西:

<table>
<tbody>
<% @pedidos.each do |pedido| %>
  <tr>
    <td><%= link_to 'Detalhes this Pedido!' detalhes_path(pedido) %></td>
    <td>More table data related to this pedido</td>
  </tr>
<% end %>
</tbody>
</table>

答案 1 :(得分:0)

很明显,您只需要使用AJAX在页面上显示所选的pedido详细信息。 Rails有一个简单的方法来做到这一点。

首先放入一张下面有div的表格,用于显示pedido信息。表中的每一行都有一个指向执行AJAX的控制器操作的链接。使用remote: true建立链接AJAX,这样用户就不会被带到另一个页面。

<table>
<tbody>
<% @pedidos.each do |pedido| %>
  <tr>
    <td><%= link_to 'More info on this Pedido!' fetch_info_pedidos_path(pedido), remote: true %></td>
  </tr>
<% end %>
</tbody>
</table>

<div id="pedido-info"></div>

在pedido控制器中制作动作路线。这是routes.rb

resources :pedidos do
  get :fetch_info, on: :member
end

这应创建一个名为/pedidos/:id/fetch_info的路径fetch_info_pedidos

表中的链接将沿此路径发出js格式请求,因此控制器操作必须准备好处理该操作。 pedido id将作为名为:id

的参数出现
def fetch_info
  @pedido = Pedido.find params[:id]
  respond_to :js
end

由于它响应js格式请求,它将使用js内容而不是html进行响应 - 这意味着我们需要将js文件作为视图,但在我们制作之前,让我们做一个部分用于显示pedido信息。可以使用render方法将其放入任何视图中。它将在app/views/pedidos/_pedido.html.erb中(您必须在文件名的开头使用下划线来表示它是部分的)您可以在此处放置任何内容,使用pedido变量来引用对于pedido。这是一个例子:

<h2>Pedido!</2>
<p>number: <%= pedido.id %></p>
<p>nom: <%= pedido.nom %></p>
<p>telefone: <%= pedido.fone%></p> 

最后让我们将js传递回浏览器。这将是一个像其他视图一样的erb文件。它只会将_pedido部分作为内容放到表格下的div中。 app/views/pedidos/fetch_data.js.erb

$('#pedido-info').html("<%= j render @pedido %>");

这就是你所需要的一切。这里j转义render方法的输出,以便它在javascript字符串中很好地播放。

在这里发生了一些Rails魔法,我将解释,因为,正如你在任何巫师训练学校学到的那样:&#34;不要使用任何魔法你不要完全理解&#34;

render方法需要渲染部分的名称,并且可选地要传递一些局部变量。如果它只给出一个ActiveRecord对象,它将查找与对象的类名匹配的部分(Pedido转到_pedido.html.erb)并且它也将对象作为局部变量传递匹配名称。因此render @pedido会转换为render partial: 'pedido', locals: {pedido: @pedido}

我还没有尝试过这个答案中的任何代码,我只是把它写在了我的头顶,所以你可能需要稍微摇晃它才能让它发挥作用。

如果您只是使用Google搜索如何执行此操作,那么您可能会遇到a link to a page {{3}}。它基本上和我在这里所说的一样,除了他的AJAX带来了一整套对象,而不是一次只有一个。