将param传递给partial

时间:2014-07-17 11:28:23

标签: ruby-on-rails

更新

我开始认为这是不可能的。如果它是一个链接而不是一个部分我可以传递一个参数,但因为它是一个部分我不能给我的形式:来自这个索引的各个微缩模型的id。听起来不错吗?我可能不得不考虑另一种方法来做我的弹出窗口?

我在弹出窗口中使用以下代码启动表单:

    <a href="#collection-popup" class="open-popup-link">
              <i class="fa fa-plus"></i></a>

    <div id="collection-popup" class="white-popup mfp-hide">
        <%= render 'collections/pop_form' %>
    </div>

<script>
$('.open-popup-link').magnificPopup({
  type:'inline',
  midClick: true // Allow opening popup on middle mouse click. Always set it to true if you don't provide alternative source in href.
});
</script>

它启动的表单开始

<%= form_for(@collection, :html => { :class => "form-horizontal"} ) do |f| %>
            <%= f.hidden_field :user_id, :value => current_user.id %>
              <%= f.hidden_field :miniature_id, :value => @miniature_id %>
            <%= f.label :status, 'Got, Want or Had?', class: "control-label"  %>

从我的@miniature show视图中可以正常工作,但我现在正试图让它在索引上工作。

控制器已

def set_collection
    @miniature_id = params[:id]
    @collection = Collection.new(miniature: @miniature)
end

所以它期待一个[:id] param。在id为miniature.id的索引中,但我无法找到将miniature.id作为:id传递给params的方法。

Miniatures索引操作如下

def index
    @search = Miniature.search(params[:q])
    @search.sorts = 'name ASC' if @search.sorts.empty?
    @miniatures = @search.result.uniq.paginate(page: params[:page])
end

miniature.id在这个索引页面上工作,因为它被放置在will_paginate使用的@miniatures部分中。如果我能展示微缩。那么我肯定可以把它传递给表格吗?

我尝试了以下

<%= render 'collections/pop_form', { id: miniature } %>
<%= render 'collections/pop_form', { id: miniature.id } %>
<%= render 'collections/pop_form', { miniature.id :id } %>
<%= render 'collections/pop_form', { id: id } %>

但是我找不到合适的人。

2 个答案:

答案 0 :(得分:1)

渲染部分,不会调用关联的控制器动作。因此,您需要通过与页面匹配的操作来定义页面中使用的所有对象以及插入到该页面中的部分内容。

所以如果控制器有动作:

def show
  @texts = ['foo','bar']
end

视图有:

<h1><%= @texts.join(' ') %></h1>

<%= render 'some/partial' %>

部分可以包含此内容:

<%= @texts.first %>

控制器操作中定义的@texts可用于主页和部分。

部分声明后的哈希允许您将局部属性传递给partials。它不会生成将传递给控制器​​的参数。

所以你可以在视图中执行此操作:

<%= render 'some/partial', locals: {something: texts.first}

然后在部分:

<%= something %>

在这两个例子中,输出将是:

<h1>foo bar</h1>
foo

这只是刮擦表面,我建议你看一下Rails指南:Layouts and Rendering in Rails

答案 1 :(得分:0)

您应该查看Rails guide on passing variables in to partial templates。特别是,您希望将其显式设置为partial,并命名您的局部变量hash。如果您发布的set_collection控制器操作正在呈现您的第一个视图,那么您可以使用@miniature_id变量。因此,您的渲染调用应该是:

<%= render partial: 'collections/pop_form', locals: {id: @miniature_id} %>