我有任务和用户.当用户完成任务时,我创建一个完成,其中有一个字段供用户指示他们花了多长时间.我需要一个表单,显示所有具有完成状态和time_spent属性的任务.在提交时,应更新已存在的完成,并应创建新的完成.如果可能的话,我想在Formtastic中这样做,但我会对基本的Rails 3解决方案感到满意.
class Completion < ActiveRecord::Base
belongs_to :task
belongs_to :user
# attribute time_spent
end
class User < ActiveRecord::Base
has_many :completions
has_many :tasks, :through => :completions
end
class Task < ActiveRecord::Base
belongs_to :milestone
has_many :completions
has_many :users, :through => :completions
end
Run Code Online (Sandbox Code Playgroud)
另一个方面是我想要显示一组特定任务,例如那些属于里程碑的任务.我应该在里程碑控制器上有一个表格发布到完成控制器吗?
class Milestone < ActiveRecord::Base
has_many :tasks
has_many :completions, :through => :tasks
end
Run Code Online (Sandbox Code Playgroud)
更新 我现在已经找了几天,我发现了很多 死路 一条.Rails表单中的这个Multiple对象很接近,但它要求所有链接对象都已存在.
让这个问题与众不同的是,有些链接尚不存在,并且没有单一的模型可以嵌套链接.例如,使用Ryan Daigle的嵌套对象形式帖子)我已经将这个工作以一种形式进行编辑所有可能的用户完成,但我需要在一个表单中编辑可能的完成的子集.我是否需要制作一个冗余对象MilestoneCompletions即has_manyCompletions和belongs_toUser?可以使用ActiveModel has_many吗?
我仍然在努力编写控制器和实际表单,以便能够使用可选模型将一个表单嵌套到另一个表单中?
我有消息,有很多联系人
提交邮件时,我想选择添加联系人.
我以此为例:
= simple_form_for Message.new, :remote => true do |f|
#message_form
= f.error_messages
%p
= f.input :account_name, :url => autocomplete_account_name_messages_path, :size => 40, :as => :autocomplete
%p
= f.input :topic, :required => true,
:input_html => {:size => 30}
#add_contact_btn
= link_to "Add Contact"
#contact_form
= f.simple_fields_for :contactd do |fc|
= fc.input :email
= fc.input :first_name
= fc.input :last_name
= f.submit 'Give'
= f.submit 'Request'
Run Code Online (Sandbox Code Playgroud)
对于Message.rb模型,我有以下内容:
has_many :contacts
accepts_nested_attributes_for :contacts, :reject_if =>:all_blank
Run Code Online (Sandbox Code Playgroud)
注意:当我使用时:simple_fields_for中的联系人不起作用,所以它是单数.但accept_nested_attributess_for的反向.
在我的消息创建控制器中,我包含了message.contacts.build
但是现在我仍然没有产生任何联系.
以下是我从google chrome中作为表单数据传递的内容:
message%5Baccount_name%5D:McKesson
message%5Btopic%5D:testing …Run Code Online (Sandbox Code Playgroud) 在Rails 3中,如果我习惯于build()构建一个对象,有没有办法在对象被保存之前销毁它?
我需要这个的原因是因为我使用嵌套的模型形式,有3代对象:Survey,有很多问题,而问题有很多答案.
在控制器中,我使用构建来预先填充问题和答案.
奇怪的是,如果Survey模型无效,我会使用错误消息重新呈现页面,并且预先构建的问题出现在表单中,但不是答案!
(顺便说一下,如果这很重要,我会使用简单表格.)
无论如何,在我将这些问题与答案一起重建之前,我只是销毁了所有问题,但是如果问题尚未保存到数据库中,你如何销毁这些问题呢?
在我的控制器中:
4.times do
question = @survey.questions.build
@answers.each { |answer| question.answers.build(:label => option.label, :input_type => option.input_type, :available_options => option.available_options) }
end
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激!谢谢!
我有一个项目模型has_many :tasks.我在rails 3.1中添加了一个嵌套资源,现在尝试使用nested_form gem来编辑项目时添加/删除任务.
我之前在另一个Rails3应用程序中使用了nested_form,它工作正常,但现在我的fields_for部分没有呈现任何东西.
这是我的代码:
#project.rb
class Project < ActiveRecord::Base
attr_accessible :nr, :name, :client_id, :project_status_id, :hidden, :active, :description, :tasks_attributes
has_many :tasks, :dependent => :destroy
accepts_nested_attributes_for :tasks, :reject_if => lambda { |a| a[:name].blank? }, :allow_destroy => true
end
#task.rb
class Task < ActiveRecord::Base
belongs_to :project
end
#views/projects/_form.html.erb
<%= simple_nested_form_for @project do |form| %>
<%= form.input :nr, :label => 'Nr' %>
<%= form.input :name, :label => 'Name' %>
<%= form.association :client, :collection => Client.all(:order => 'name'), …Run Code Online (Sandbox Code Playgroud) ruby-on-rails nested-forms nested-form-for simple-form ruby-on-rails-3.1
我明白了
ActiveRecord :: RecordNotFound:对于ID =的订单,找不到ID = 3的客户端
在尝试为现有客户提交订单时.这通过键入以下内容通过表单或控制台进行:
Order.new(:client_attributes => { :id => 3 })
Run Code Online (Sandbox Code Playgroud)
payment_form.html.erb:
<%= semantic_form_for @order, :url => checkout_purchase_url(:secure => true) do |f| %>
<%= f.inputs "Personal Information" do %>
<%= f.semantic_fields_for :client do |ff| %>
<%= ff.input :first_name %>
<%= ff.input :last_name %>
<!-- looks like semantic_fields_for auto-inserts a hidden field for client ID -->
<% end %>
<% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
Order.rb:
class Order < ActiveRecord::Base
belongs_to :client
accepts_nested_attributes_for :client, :reject_if …Run Code Online (Sandbox Code Playgroud) 我有一个嵌套的表单(使用Ryan B的nested_form gem),使用has_and_belongs_to_many来设置has_and_belongs_to_many:
Opening has_and_belongs_to_many :contacts
Contact has_and_belongs_to_many :openings
在尝试向开口添加新联系人时,在这种情况下,我得到:
Can't mass-assign protected attributes: new_1346666966632
对于
"opening"=>{"contacts_attributes"=>{"new_1346666966632"=>{"contacts"=>{"name"=>"Test Contact",
我添加了相应的"accepts_nested_attributes_for"和"attr_accessible",并在控制器中构建了联系人,即@ opening.contacts.build和@ opening.contacts.build(params [:opening] [:contact_attributes]).
我哪里错了?在这里使用has_many通关系会更好吗?
编辑:
视图:
<%= simple_nested_form_for @opening, :wrapper => :plain do |f| %>
<%= f.link_to_add "Add a contact", :contacts %>
<%= f.button :submit %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
其中使用partial为嵌套联系人生成字段:
<%= f.fields_for :contacts, @opening.contacts.build do |contact_form| %>
<%= contact_form.input :name, :label => false, :input_html => { :class => 'span6' } %>
<%= contact_form.input :company, :label => false, :input_html => { …Run Code Online (Sandbox Code Playgroud) ruby-on-rails nested-forms has-and-belongs-to-many nested-attributes ruby-on-rails-3
我已将用户的帐户区域拆分为不同的表单,然后在注册表单中,我将这些位一起拉出来,如下所示:
class RegistrationFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('email', 'email', array(
'label' => '* Email address:'
))
->add('account_personal', 'my_personalinfo_form', array(
'property_path' => 'account'
))
->add('account_contact', 'my_contactinfo_form', array(
'property_path' => 'account'
))
;
}
Run Code Online (Sandbox Code Playgroud)
问题是错误消息account_personal正在冒泡到表单的顶部.例如,如果在个人信息表单中将名字留空,请输入"请输入您的名字"."个人"和"联系"表单在自己的页面上以自己的形式正常工作.
错误消息account_contact很好,并显示在正确的字段旁边.
但是,如果我在->add上面交换两个位(account_contact首先是这样),那么问题就会反转; account_personal现在工作的错误消息在相应的字段旁边显示正常,但现在错误account_contact被冒泡到顶部!
任何建议非常感谢!
-----编辑-----
个人信息表:
class PersonalInfoType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title', 'text')
->add('first_name', 'text', array(
'required' => true,
'label' => …Run Code Online (Sandbox Code Playgroud) 我将Rails 3,simple_form和cocoon用于has_many TodoLists项目的嵌套表单。我希望我的simple_fields_for调用仅包含尚未被软删除的TodoList,这就是为什么我想使用命名范围“未删除”的原因。
在我的项目表格中,我有:
<%= f.simple_fields_for :todo_lists, f.object.todo_lists.nondeleted do |todo_list_form| render "todo_list_fields", :f => todo_list_form end %>
Run Code Online (Sandbox Code Playgroud)
这在我的编辑视图的首次加载时效果很好(即,未显示已删除的TodoList),但是在提交表单时通过了失败的验证,所有新添加的TodoList都会丢失。
如果删除命名作用域,则验证失败后不会丢失新添加的TodoList,但随后会显示所有TodoList(包括已删除的TodoList)。
我也尝试了以下方法:
<% @project.todo_lists.each do |todo_list| %>
<% if !todo_list.deleted && !todo_list.name.blank? %>
<%= f.simple_fields_for :todo_lists, todo_list do |todo_list_form| render "todo_list_fields", :f => todo_list_form end %>
<% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
这解决了两个问题,但并没有提供我所需的灵活性,例如使TodoList保持正确顺序的能力。
有没有一种方法可以将集合传递给simple_fields_for(据我了解,它具有与Rails的fields_for相同的相关行为),这将允许我使用命名范围和排序,而不会在验证失败时删除新添加的字段?
我有一个嵌套的表单(订单中的付款),我想在编辑视图中测试我的嵌套表单(fields_for)中的值.但问题是我无法检查每个,我可以这样做:
<% if @order.payments[0].monthly == false %>
Run Code Online (Sandbox Code Playgroud)
你现在是如何检查每个,如:
<% if @order.payments[current_payment].monthly == false %>
Run Code Online (Sandbox Code Playgroud) 我一直在使用Cocoon gem来动态生成rails中的嵌套字段.我遇到了一个应用程序,我想用数字标记cocoon生成的字段; 如下所示.
Field 1: __________
Field 2: __________
Field 3: __________
Run Code Online (Sandbox Code Playgroud)
我想我可以通过编写自己的javascript来强制它,但有没有内置功能可以帮助我做到这一点?
非常感谢任何指导.
nested-forms ×10
simple-form ×3
activerecord ×1
cocoon-gem ×1
fields-for ×1
nested-sets ×1
symfony ×1
symfony-2.1 ×1