我正在制作一个具有以下属性的应用程序,我正在创建一个单一的表单,以便能够保存一个目标、一个目标的任务、一个目标的里程碑和一个里程碑的任务。
#app/models/goal.rb
has_many :tasks, :as => :achievement
has_many :milestones
accepts_nested_attributes_for :tasks
accepts_nested_attributes_for :milestones
#app/models/milestone.rb
belongs_to :goal
has_many :tasks, :as => :achievement
#app/models/task.rb
belongs_to :achievement, :polymorphic => true
Run Code Online (Sandbox Code Playgroud)
每当我用它的属性保存目标时,任务模型似乎对它们属于什么成就类型感到困惑,导致每个里程碑任务都被列为目标任务。我的表单、部分和控制器代码如下。
形式:
<%= nested_form_for @goal do |f| %>
<%= render 'shared/error_messages', :object => f.object %>
<%= render 'shared/goal_fields', :f => f %>
<%= f.fields_for :milestones do |ff| %>
<%= render 'shared/milestone_fields', :f => ff %>
<% end %>
<%= f.fields_for :tasks do |ff| %>
<%= render 'shared/task_fields', :f => ff %>
<% end …Run Code Online (Sandbox Code Playgroud) ruby-on-rails nested-forms form-for polymorphic-associations ruby-on-rails-3
使用 Rails 4.1.13 和 Ruby 2.0.0(虽然我在使用 Ralis 4.0 和 Ruby 1.9.3 时遇到了同样的问题。我已经阅读了许多关于这个特定问题的文章,但无法理解为什么我的解决方案(看起来完全像这样)没有工作,所以请帮助我。
我有两个模型 BlogPost 和 Tag。一个博客帖子可以有多个标签,一个标签可以有多个博客帖子。我通过第三个模型 BlogPostRelation 将它们连接起来。因此,这是我的基本设置:
# blog_post.rb
has_many :blog_post_tag_relations, dependent: :destroy
has_many :tags, :through => :blog_post_tag_relations
accepts_nested_attributes_for :blog_post_tag_relations, :tags
# tag.rb
has_many :blog_post_tag_relations, dependent: :destroy
has_many :blog_posts, :through => :blog_post_tag_relations
# blog_post_tag_relation.rb
belongs_to :tag
belongs_to :blog_post
validates_uniqueness_of :tag_id, :scope => [:blog_post_id]
validates :blog_post_id, :presence => true
validates :tag_id, :presence => true
accepts_nested_attributes_for :tag, :blog_post
Run Code Online (Sandbox Code Playgroud)
我有一个使用 Formtastic 的 BlogPost 表单,我在其中使用以下命令为 BlogPost 创建复选框:
<%= f.input :blog_title %> …Run Code Online (Sandbox Code Playgroud) 我正在处理复杂的注册表。我的用户将拥有他们的个人资料,其中包含联系信息和项目集合。我的架构(用户、个人资料、电话、集合、项目)如下所示:
defmodule MyProject.User
schema "users" do
field :email, :string
field :name, :string
has_many :profiles, MyProject.Profile, on_delete: :delete_all
has_many :collections, through: [:profiles, :collections]
timestamps()
end
end
defmodule MyProject.Profile
schema "profiles" do
field :address, :string
field :skype, :string
belongs_to :user, MyProject.User
has_many :phones, MyProject.Phone, on_delete: :delete_all
has_many :collections, MyProject.Collection, on_delete: :delete_all
timestamps()
end
end
defmodule MyProject.Phone
schema "phones" do
field :phone, :string
belongs_to :profile, MyProject.Profile
end
end
defmodule MyProject.Collection
schema "collections" do
field :name, :string
has_many :items, MyProject.Item, on_delete: :delete_all
timestamps()
end …Run Code Online (Sandbox Code Playgroud) 我想fields_for在关联中使用记录的子集.
我有一个Month模型,哪个has_many :payments.
但在我看来,我只希望得到fields_for一些付款.例如:
- fields_for @month.payments.large
Run Code Online (Sandbox Code Playgroud)
这不起作用.
我可以传递一组记录fields_for,而不是通常的符号(fields_for :payments)方法吗?
我无法更新多级嵌套表单中的数据.我使用partials来包含创建和更新视图的所有字段,并且我没有创建问题.只有更新.
基本上结构(简化)是:
user has_one profile
profile has_many addresses
form_for @user do |u|
u.fields_for :profile do |p|
p.fields_for :addresses do |a|
Run Code Online (Sandbox Code Playgroud)
就像我说的,创建用户,配置文件和地址工作正常.直到我试图更新我发现问题.我没有收到错误,它实际上显示它已成功更新.它实际上正确地更新了用户和配置文件字段,而不是地址字段.
这里是堆栈跟踪更新的参数.(再次,总结和格式化)
Parameters: {"controller"=>"profiles", "action"=>"update", "_method"=>"put", "id"=>"1",
"user"=>{"login" => "username",
"profile_attributes"=>{"first_name"=>"Admin",
"addresses_attributes"=>{
"0"=>{"address"=>"123 Address Ave.", "city"=>"Cityville", "state"=>"CA"}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我能找到的所有文档只显示1个嵌套表单,所以我不确定我是否正确使用update_attributes超过1级深度.
有什么想法吗?
我正在尝试构建一个多模型表单 - 但其中一个问题是,我需要链接表单中的模型.
例如,假设我拥有的表单具有以下模型:用户,配置文件
在创建新用户时,我想同时创建一个新的配置文件,然后将这两个配置文件链接起来.问题是,如果还没有创建它们,它们还没有ID - 那么如何分配链接值?
谢谢!
-Elliot
我注意到,有些人喜欢这个 - 要查看更多关于链接两个模型的信息,请查看我的第二个问题,它有一个答案:以多模型形式链接两个模型
我有两个连接表连接的模型:
class Publication < ActiveRecord::Base
attr_accessible :title, :author_attributes, :translator_attributes
has_many :publication_contributors
has_many :authors, :through => :publication_contributors, :source => :contributor,
:conditions => {:publication_contributors => {:contributor_type => "Author"}}
has_many :translators, :through => :publication_contributors, :source => :contributor,
:conditions => {:publication_contributors => {:contributor_type => "Translator"}}
accepts_nested_attributes_for :authors, :translators
end
class Contributor < ActiveRecord::Base
attr_accessible :name
has_many :publications, :through => :publication_contributors
has_many :publication_contributors
end
class PublicationContributor < ActiveRecord::Base
attr_accessible :contributor_type
belongs_to :publication
belongs_to :contributor
end
Run Code Online (Sandbox Code Playgroud)
请注意,连接表具有第三个属性(在publication_id和contributor_id旁边),称为contributor_type.此属性可能包含诸如"作者","翻译者","编辑者"或其他内容的角色.在我的出版物模型中,我为两个更常见的contributor_types创建了一对关联,"Author"和"Translator".这些关联可以很好地检索相关数据,例如@publication.authors.但是,当通过嵌套形式创建这些关联时,它会溅射.
我的表单看起来像这样:
<%= form_for @publication, :remote => true …Run Code Online (Sandbox Code Playgroud) 我使用rails 4和嵌套表单和强参数.
我需要从一个表单更新多个模型.
这就是我宣布强大参数的方式.从父控制器.该协会是的has_many和belongs_to的顺序去Rundatum->材料 - > ParticleSize
def rundatum_params
params.require(:rundatum).permit( :material, :company_id, :material_density, :feed_moisture, :date, :building, :machine, :material_weight, :time_mins, :rate_lb_hr, :mill_amps, :class_amps, :mill_liner, :beater_plate_size, :mill_rpm, :class_rpm, :feeder_type, :feeder_setting, :feeder_aug_diameter, :tlgs_set, :air_pressure, :temp_mill_out, :temp_prod_out, :temp_ambient,
materials_attributes: [:id, :name, :density, :msds_url, :moisture, :notes, :_destroy],
particle_sizes_attributes: [:id, :screen, :percent_through, :percent_retained, :_destroy])
end
Run Code Online (Sandbox Code Playgroud)
rails服务器的输出是:
Rundatum Load (0.6ms) SELECT "rundata".* FROM "rundata" WHERE "rundata"."id" = $1 LIMIT 1 [["id", 7]]
Unpermitted parameters: particle_sizes_attributes
Run Code Online (Sandbox Code Playgroud)
从一个表单更新多个模型时,声明强参数的方法是什么?
谢谢
我正在尝试使用form_for和制作嵌套表单fields_for.经过大量的研究和成功,不再在我的项目上工作了.我只是想重新创建一个railscast,看看我做错了什么.
我正在尝试重新创建在http://railscasts.com/episodes/196-nested-model-form-part-1上找到的示例,因为代码存在,所以不应该那么难,但我可以'设法从调查中创建问题.这是我的代码,直到现在:
rails new surveysays
rails g scaffold survey name:string
rake db:migrate
rails g scaffold question survey_id:integer content:text
rake db:migrate
Run Code Online (Sandbox Code Playgroud)
我正在尝试以完全相同的视频序列进行操作.我的问题模型:
class Question < ActiveRecord::Base
belongs_to :survey
end
Run Code Online (Sandbox Code Playgroud)
我的调查模型:
class Survey < ActiveRecord::Base
has_many :questions, dependent: :destroy
accepts_nested_attributes_for :questions
end
Run Code Online (Sandbox Code Playgroud)
我的调查表格带有嵌套问题字段:
<%= form_for(@survey) do |f| %>
...
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<%= f.fields_for :questions do |builder| %>
<p>
<%= builder.label :content, "Question" %><br/>
<%= builder.text_area :content, :row …Run Code Online (Sandbox Code Playgroud) 我有以下一些代码,使用带有protected_attributes gem的Rails 4.1正常工作(我没有将我的代码移到strong_parameters)
class Employee
has_and_belongs_to_many :skills
attr_accessible :skill_ids, ...
end
Run Code Online (Sandbox Code Playgroud)
class Skill
has_and_belongs_to_many :employees
end
Run Code Online (Sandbox Code Playgroud)
我在更新员工时将技能绑定到员工,因此我的视图如下所示
<%= form_for @employee, do |f| %>
.....
<%= f.collection_select :skill_ids, Skill.all, :id, :name, {},
{:multiple => true, class: 'select2 '} %>
......
<% end %>
Run Code Online (Sandbox Code Playgroud)
skill_ids是attr_accessible params的一部分,因此它在保存员工表单时工作得很好.(注意:这甚至不需要accept_nested_attributes_for:在员工模型中设置的技能)
我正在将我的代码迁移到Rails 4.2并转移到强参数.
我在employees控制器中列出了skill_ids并在更新操作上调用了这个,如下所示:
def update
@employee = Employee.find(params[:id])
@employee.update_attributes(employee_params)
end
private
def employee_params
params.require(:employee).permit(:skill_ids, .....)
end
Run Code Online (Sandbox Code Playgroud)
但它不会更新员工的技能ID.
有人可以指出我在Rails 4.2中发生了哪些变化,以保存这些关联值?
谢谢.
ruby-on-rails nested-forms has-and-belongs-to-many ruby-on-rails-4.2
nested-forms ×10
controller ×1
ecto ×1
elixir ×1
field ×1
form-for ×1
formbuilder ×1
forms ×1
jointable ×1
ruby ×1