Mar*_*rco 8 ruby ruby-on-rails nested-forms has-many-through simple-form
如何为has_many :through具有其他属性的关联生成表单字段?
该has_many :through关系有一个名为的附加列weight.
这是连接表的迁移文件:
create_table :users_widgets do |t|
t.integer :user_id
t.integer :widget_id
t.integer :weight
t.timestamps
end
Run Code Online (Sandbox Code Playgroud)
模型看起来像这样:
User
has_many :widgets, :through => :users_widgets,
:class_name => 'Widget',
:source => :widget
has_many :users_widgets
accepts_nested_attributes_for :widgets # not sure if this is necessary
Widget
has_many :users, :through => :users_widgets,
:class_name => 'User',
:source => :user
has_many :users_widgets
accepts_nested_attributes_for :users # not sure if this is necessary
UsersWidget
belongs_to :user
belongs_to :widget
Run Code Online (Sandbox Code Playgroud)
为了简单起见,Widget和User只有一个自己的字段叫做nameergo User.first.name和Widget.first.name
问题:
如何将具有相应权重的窗口小部件的下拉选项附加到用户创建/编辑表单?
如何向用户或用户表单动态添加其他窗口小部件表单到窗口小部件以轻松添加或删除这些关系?该nested_form_for宝石似乎是完美的解决方案,但我一直没能得到它的工作.
除了模型和表格部分,是否需要对我的控制器进行任何更改?
快速注释..我对在用户窗体中创建新窗口小部件或在窗口小部件窗体中创建新用户不感兴趣,我只希望能够从现有对象中进行选择.
我正在运行Rails 3.1和simple_form 2.0.0dev来生成我的表单.
小智 6
根据你的问题.我做了一个简单的应用程序 来源在这里:https://github.com/yakjuly/nest_form_example 我将它部署到heroku,你可以打开页面:http://glowing-lightning-1954.heroku.com/users/new
答案
你想用户表单可以选择有重量的小部件,需要做更多的工作.下拉选择不能满足你的要求.
我在"bootstrap-rails"插件中混合了"nested_form",你可以更轻松地添加nested_fields
在我的例子中,你需要添加一个动作调用select,并使WidgetsController #create可以responsed_with:js
代码基于simple_form,你可以尝试一下.
我将使用cocoon解决您的问题,我创建了一个用于处理动态嵌套表单的gem.我还有一个示例项目来显示不同类型关系的示例.
你的字面意思并不完全包含在内,但并不难从中衍生出来.在你的模型中你应该写:
class User
has_many :users_widgets
has_many :widgets, :through -> :user_widgets
accepts_nested_attributes_for :user_widgets, :reject_if => :all_blank, :allow_destroy => true
#...
end
Run Code Online (Sandbox Code Playgroud)
然后,您需要创建一个部分视图,列出您的链接UserWidgets.将此部分放在一个名为的文件中users/_user_widget_fields.html.haml:
.nested-fields
= f.association :widget, :collection => Widget.all, :prompt => 'Choose an existing widget'
= f.input :weight, :hint => 'The weight will determine the order of the widgets'
= link_to_remove_association "remove tag", f
Run Code Online (Sandbox Code Playgroud)
在你的作品中users/edit.html.haml你可以写:
= simple_form_for @user do |f|
= f.input :name
= f.simple_fields_for :user_widgets do |user_widget|
= render 'user_widget_fields', :f => user_widget
.links
= link_to_add_association 'add widget', f, :user_widgets
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.