我正在使用ActiveAdmin构建rails应用程序,并希望在控制器中为自定义操作构建表单。我试图将@listings从collective_action传递到渲染文件,允许我一次编辑多个记录。 @listings基于ActiveRecord查询,该查询从URL中提取记录ID。
它似乎成功地从URL访问参数,并查询数据库。但是,当表单提供给浏览器时,它无法生成listing.title的值。有什么想法吗?
这是我的Listing.rb:
ActiveAdmin.register Listing do
collection_action :batch_upload do
ids = params[:id]
@listings = []
@listings = Listing.find(ids)
render template: 'listings/edit_batch'
end
end
这是我的edit_batch.html.haml:
= semantic_form_for :listing, :url => {:controller => 'listings', :action => 'batch_upload'}, :html=>{:method=>:put} do |f|
-@listings.each do |listing|
=f.hidden_field :id, :value => listing.id
=f.input :title, :value => listing.title
=f.submit "Submit"
答案 0 :(得分:1)
如果表单正确显示listing.id
但不是listing.title
,那么我怀疑该记录没有设置标题,或者列表没有标题属性。
要检查,请运行Rails控制台并使用表单中的id找到记录:
$ Listing.find(1)
检查返回的对象以查看它是否缺少标题。
答案 1 :(得分:1)
我将代码更改为输入,以便它直接访问其html并运行:
=f.input :title, :input_html => { :value => listing.title }
答案 2 :(得分:0)
使用Formtastic的inputs
块可能有助于简化每个列表的输入。这样做将允许表单为每个Listing对象创建属性字段。
# edit_batch.html.haml
= semantic_form_for :listing, :url => {:controller => 'listings', :action => 'batch_upload'}, :html=>{:method=>:put} do |f|
- @listings.each_with_index do |listing, index|
f.inputs for: listing, for_options: { index: index } do |l|
= l.input :id, as: :hidden
= l.input :title
= f.submit "Submit"
:for
和:for_options
范围输入特定对象的字段。