我有一个使用has_many关系的嵌套表单.在我的表单视图中,我使用部分字段输入并传递FormBuilder对象.
form.html.haml:
- form_for @record do |f|
.field
= container do
- f.fields_for :strings do |s|
= render :partial => 'string_fields', :locals => {:s => s}
Run Code Online (Sandbox Code Playgroud)
_string_fields.html.haml:
= s.hidden_field :id
= s.hidden_field :language_id
.field
%h3
= t(:name)
= s.text_field :name, :size => 50
.field
%h3
= t(:description)
= s.text_area :description, :rows => 6
Run Code Online (Sandbox Code Playgroud)
这应该工作; 但是,我想在AJAX中添加功能以使用RJS动态添加另一组字段,当我尝试通过RJS渲染部分时,显然s没有定义(我不知道我通过了什么:locals哈希值).
有没有办法将字段动态地添加到由定义的字段集中fields_for,或者我是否必须重新实现我的部分而不使用帮助程序?
当我运行rails服务器并转到我网站上的学校/新页面时,会出现标有"学校"标签的字段,我可以在其中输入学校的名称,但是field_for下的所有其他字段用于输入学校管理员的信息不要出现在我的网站上 - 当我在我的表格上使用"检查元素"时,就好像他们甚至不在那里.他们为什么不出现在我的页面上?
<%= form_for(@school) do |f| %>
<% if @school.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@school.errors.count, "error") %> prohibited this school from being saved:</h2>
<ul>
<% @school.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :school %><br />
<%= f.text_field :name %>
</div>
<%= f.fields_for :admin do |f2| %>
<div class="field">
<%= f2.label "administrator name" %><br />
<%= f2.text_field :name %>
</div>
<div class="field">
<%= f2.label "administrator email" %><br /> …Run Code Online (Sandbox Code Playgroud) 我通过单击link_to_add函数链接添加新表行时遇到问题.
希望有人可以在这里建议修复.我对Rails相当新,并探索Rails 4.0中的变化.我在Rails 4.0中构建了这个简单的食谱书应用程序.我有食谱的主要模型(名称,cook_time,oven_temp,说明等).因为一些食谱可能有5种成分而其他食谱可能有20种,我想在一个带有has_many关联的单独模型中打破成分.所以食谱has_many成分和accepts_nested_attributes_for:成分.以下是模型:
recipe.rb
class Recipe < ActiveRecord::Base
belongs_to :user
belongs_to :category
has_many :ingredients, :dependent => :destroy
validates :name, presence: true, length: { maximum: 50 }
accepts_nested_attributes_for :ingredients,
:reject_if => lambda { |a| a[:name].blank? },
:allow_destroy => true
end
Run Code Online (Sandbox Code Playgroud)
ingredient.rb
class Ingredient < ActiveRecord::Base
belongs_to :recipe
end
Run Code Online (Sandbox Code Playgroud)
提醒:Rails 4.0不再使用attr_accessible,而是使用强params将赋值移动到控制器中.
recipes_controller.rb
class RecipesController < ApplicationController
before_action :find_recipe, only: [:show, :edit, :update, :destroy]
before_action :set_current_user, except: [:index, :show]
respond_to :html, :js
...
def edit
end
def update
if @recipe.update_attributes(recipe_params)
redirect_to @recipe
else …Run Code Online (Sandbox Code Playgroud) 我正在显示一个案例的一些联系人。问题是我想把它们分成几组。
客户 ...列出客户 前律师 ...列出前律师 反对方 ...列出反对方
<% current_account.roles.each do |role| %>
<%= f.fields_for :case_contacts, f.object.case_contacts.order(:role) do |builder| %>
<% if builder.object.role == role %>
<%= render partial: 'contact_fields', locals: { f: builder, edit: edit } %>
<% end %>
<% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
所以这有效,只是它在我的 html 中留下了空的 div.fields。
有没有办法将条件放在 fields_for 语句中
<%= f.fields_for :case_contacts, f.object.case_contacts.order(:role), if f.object.role = role do |builder| %>
Run Code Online (Sandbox Code Playgroud)
我知道这个例子是错误的。
而且,实际上,我可以不用 fields_for 一起生成的 div.fields
编辑:如果 fields_for 只显示 builder.object.role = role 的字段,我想我什至不需要订购它
我正在一个表单的索引视图中编辑父模型的多个实例,如Railscasts#198.每个父母has_many:children和accepts_nested_attributes_for:children,如Railscasts#196和#197
<%= form_tag %>
<% for parent in @parents %>
<%= fields_for "parents[]", parent do |f|
<%= f.text_field :job %>
<%= f.fields_for :children do |cf| %>
<% cf.text_field :chore %>
<% end %>
<% end %>
<% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
给定parent.id == 1
f.text_field:作业正确生成
<input id="parents_1_job" type="text" value="coding" size="30" name="parents[1][job]">
Run Code Online (Sandbox Code Playgroud)
但是cf.text_field:chore生成的id和没有父索引的名称.
id="parents_children_attributes_0_chore"
name="parents[children_attributes][0][chore]"
Run Code Online (Sandbox Code Playgroud)
如果我尝试将特定的子对象传递给f.fields_for,如下所示:
<% for child in parent.children %>
<%= f.fields_for :children, child do |cf| %>
<%= cf.text_field :chore %>
<% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
我得到了同样的结果.如果我改变方法:从孩子到"[]孩子",我得到了 …
我有以下协会:
class Developer < ActiveRecord::Base
has_many :large_photos, :class_name => 'Photo', :conditions => { :large => true }, :reject_if => proc { |x| x['image'].blank? }
end
class Photo < ActiveRecord::Base
belongs_to :developer
mount_uploader :image, ImageUploader # Carrierwave
end
Run Code Online (Sandbox Code Playgroud)
现在,我正在寻找一个开发表单,在提交时,将添加一个文件字段来上传新表单Photo.目前我有:
<%= form_for @developer do |form| %>
<%= form.fields_for :large_photos do |sf| %>
<div class="dropzone">
<%= sf.file_field :image %>
<%= sf.hidden_field :large, :value => '1' %>
<%= sf.hidden_field :image_cache %>
</div>
<% end %>
<% end%>
Run Code Online (Sandbox Code Playgroud)
现在,我fields_for遇到的问题是循环现有的记录(当然是!),我宁愿避免,我只想添加一个文件字段来上传新照片.我该怎么做?
我有一个真正的野兽形式,基本上是一个五页的销售形式,当创建一个新的形式一切都很好.但是当你去编辑新表格时,它会复制字段和值四次,有时甚至是7次.我不知道编辑操作是如何工作的,它使用与新操作使用的相同的部分形式.但这是我的控制器操作新的和编辑操作.
此外,复制不会发生在每个字段中,似乎只发生在存在has_many关系的部分.
# GET /references/new
# GET /references/new.json
def new
@reference = Reference.new
@user_id = params[:user_id]
@reference.build_customer_overview
@reference.build_solution_description
@reference.solution_description.deal_details.build
component = @reference.components.build
component.servers.build
component.services.build
partner = @reference.build_partner
partner.competitors.build
partner.contacts.build
respond_to do |format|
format.html # new.html.erb
format.json { render json: @reference }
end
end
# GET /references/1/edit
def edit
@reference = Reference.find(params[:id])
@user_id = @reference.user_id
end
Run Code Online (Sandbox Code Playgroud)
我只是不知道它为什么会在编辑操作上生成额外的字段,希望有更多铁路经验的人知道这种行为.
谢谢!
编辑:
以下是每个红宝石块渲染4次的表单部分.
<%= f.fields_for :deal_details do |ff| %>
<div>
<%= ff.label :title, 'Customer\'s business/IT needs (why was this solution required)' %> …Run Code Online (Sandbox Code Playgroud) 我目前正在为模型构建表单,并且无法为表单开发相关的模型表单.
我收到的错误:
undefined method `tradie_id' for #<ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_TradieCategory:0xd0f9d78>
Run Code Online (Sandbox Code Playgroud)
表单代码如下:
= form_for @data[:tradie], url: { action: "update_tradie" } do |tradie|
# This doesn't work
= tradie.fields_for :tradie_categories, @data[:tradie].tradie_categories do |category|
= category.text_field :tradie_id
# However this fields_for does
= tradie.fields_for :tradie_locations, @data[:tradie].tradie_locations do |location|
= location.text_field :address
Run Code Online (Sandbox Code Playgroud)
该Tradie模型具有has_many与关系TradieCategory模型和TradieCategory模型具有belongs_to与关系Tradie.我还验证了TradieCategory有一个字段tradie_id.
在上面的表单中,@data[:tradie]等于Tradie模型的实例.每当我打电话tradie_categories或tradie_locations他们呼吁的相关模型数据TradieCategory和TradieLocation.
最后,在我的视图代码中,如果我运行= @data[:tradie].tradie_categories.to_a,我会在我的html页面上返回
[#<TradieCategory …Run Code Online (Sandbox Code Playgroud) 我有三个模型, companies,transactions和subtransactions。每个都有很多下一个。我需要构建一个保存transactions到subtransactions.
我正在努力寻找表单的最佳方法以及保存到数据库的适当方法。理想情况下,如果所有记录都通过验证,则立即保存记录。
我的简化形式:
<%= form_for(@transaction) do |f| %>
<div class="field" id="transaction_amount">
<%= f.label :total %><br>
<%= f.text_field :total %>
</div>
<% 1.upto(5) do |i| %>
<%= fields_for("subtransaction[#{i}]") do |s| %>
<div class="field" id="subtotal_amount">
<%= s.label :subtotal, "Subtotal #{i}" %><br>
<%= s.text_field :subtotal %>
</div>
<% end %>
<% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
我的交易控制器:
def new
@transaction = company.transactions.build if logged_in?
end
def create
@transaction = company.transactions.build(transaction_params)
params[:subtransaction].each …Run Code Online (Sandbox Code Playgroud) fields-for ×10
forms ×4
associations ×3
cocoon-gem ×2
controller ×1
field ×1
formtastic ×1
gem ×1
parameters ×1
partials ×1
ruby ×1
simple-form ×1