【问题标题】:ActiveAdmin - Pass locals to formActiveAdmin - 将本地人传递给表单
【发布时间】:2013-07-15 01:11:08
【问题描述】:

在我的photos.rb 文件中,我有:

ActiveAdmin.register Photo do
  form :partial => 'admin/forms/photo', :locals => { :events => Event.all }
end

在我的_photo.html.erb 文件中,我希望能够访问事件的值,但它似乎无法检测到。我该怎么做?

根据评论中的要求,这是我的表格:

<% if events.any? %>
  <%= form_for [:admin, @photo], :validate => true do |f| %>
    <!-- insert a bunch of standard field divs here -->
    <div class="actions" style="margin-top: 20px">
      <% if @photo.new_record? %>
        <%= f.submit 'Create photo' %>
      <% else %>
        <%= f.submit 'Update photo' %>
      <% end %>
    </div>
  <% end %>
<% else %>
  <div style="font-size: 14px">
    You cannot add photos until you have added at least one event.
  </div>
<% end %>

我收到的错误消息在 events.any? 行附近:

Completed 500 Internal Server Error in 108ms

ActionView::Template::Error (undefined local variable or method `events' for #<#<Class:0x007fdb8e841b80>:0x007fdb8a93e7a8>)

【问题讨论】:

  • 你也可以发布你的部分吗?
  • 您在尝试访问此表单时是否在浏览器或控制台中出现错误?因为我看到您以正确的方式传递变量。如果您在日志中有任何错误,也请附上。

标签: ruby-on-rails-3 forms activeadmin


【解决方案1】:
form do |f|
  f.render partial: 'admin/forms/photo', locals: { f: f, events: Event.all }
end

请注意,您需要从部分中删除form_forsemantic_form_foractive_admin_form_for 等,因为它将被admin/photos.rb 中的form do 部分覆盖,否则会有两个嵌套形式.

部分示例:

# app/views/admin/forms/_photo.html.arb
if events.any?
  f.inputs do
    f.input :title, label: 'Etc'
    f.input :file
  end
  f.actions
else
  f.div 'You cannot add photos until you have added at least one event.', 
        style: 'font-size: 14px'
end

【讨论】:

  • 我尝试了这种方法,部分输入被渲染了两次
  • @Stpn 是的,每当我与 Active Admin 合作时,由于疯狂的 Arbre 上下文问题,我也会遇到这类问题。有时输入甚至会出现在表单之外:) 尝试在部分内部使用不同的方法,例如只是input 而不是f.input,反之亦然。此外,如果您使用 =f.input 之类的东西,请自动删除 = 作为 Arbre 输出。
【解决方案2】:
form do |f|
    render partial: 'admin/forms/photo', locals: { value: 'random_data' }
end

您可以使用 f.render 或仅使用 render

请注意,partial: 需要将本地人发送到表单

部分示例

#app/views/admin/forms/_photo.html.arb
active_admin_form_for [:admin, resource] do |f|
    f.semantic_errors *f.object.errors.keys

    f.inputs do
       f.input :name
       f.input :random if (value == 'random_data')
    end
   f.actions
end

【讨论】:

    【解决方案3】:

    对此的另一个想法,如果您只想检查数据库中是否有任何事件,您可以直接在Class 上拨打any

    <% if Event.any? %>
      do this
    <% else %>
      do that
    <% end %>
    

    没有将变量发送到部分,上面的代码导致:

    2.0.0p0 :004 > Event.any?
       (0.6ms)  SELECT COUNT(*) FROM "events"
     => true
    

    并在没有本地人的情况下保留 ActiveAdmin 部分:

    ActiveAdmin.register Photo do
      form :partial => 'admin/forms/photo'
    end
    

    【讨论】:

    • 虽然感觉有点乱——我不喜欢这样在我的模板中加入逻辑。我将在今天晚些时候检查我的错误日志,并在该说明上回复您。
    • 试试这个:form(:partial =&gt; 'admin/forms/photo', :locals =&gt; { :events =&gt; Event.all })
    • 括号似乎没有帮助
    • form(render :partial =&gt; 'admin/forms/photo', :locals =&gt; { :events =&gt; Event.all })  试试这个,奇怪的是 rails api 说它应该可以工作,但它没有。
    • 我得到了undefined method render' 用于#<:resourcedsl:0x007fdb8ef1d5a8>`
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    相关资源
    最近更新 更多