我正在尝试通过基本表单实现 has_one 关系,但完全陷入困境。
我似乎在 Controller 和表单中尝试了大量的组合,但似乎没有取得任何进展。
我有一个电话号码,我使用由 API 填充的外部服务。
最终,我希望为此设置所有此类电话号码,但现在我很高兴只使用一个。
parent.rb
has_one :clever_phone
还有手机型号
clever_phone.rb
attr_accessible :number, :parent_id, :prefix, :country_iso
belongs_to :parent
Controller
clever_phones_controller
def new
@parent = Parent.find(params[:parent_id])
@clever_phone = @parent.build_clever_phone
def create
@parent = Parent.find(params[:parent_id]
@clever_phone = Parent.create_clever_phone(params[:clever_phone])
查看 我真的不想在这里从父级做一个嵌套表单,因为我有一些复杂的代码,这些代码通过一个 api 生成创建过程中使用的信息,我认为正确的是,位于 smart_phones_controller 中。
@simple_form_for @clever_phone do |f|
= f.input :country_iso, as: :country, :iso_codes => true, priority: ["gb"]
= f.input :prefix
= f.submit
路线
resources :parent do
resource :clever_phone
end
我的问题是 @parent 的参数似乎没有传递给 Controller 中的 create 方法,因此我得到了 “没有身份证就找不到家长” 错误
如果我尝试将其作为嵌套形式 我明白了 NoMethodError 未定义方法“parent_clever_phones_path” 事实上我没有使用过它,只使用了parent_clever_phone_path(注意没有复数)。
我确信这应该非常简单,但我已经盯着它看了几个小时了,我已经束手无策了......
有什么想法吗?
最佳答案
好吧,有几个问题需要您解决:
--
变量
@parent
参数未被传递的原因是您没有将它们包含在表单中。这就是嵌套表单非常方便的地方 - 在一次调用中传递您的 parent
参数和 clever_phone
参数
既然您不想这样做,我建议至少使用 clever_phone
所在的 parent_id
填充隐藏字段
关联于:
#app/views/clever_phones/new.html.erb
= simple_form_for @clever_phone do |f|
= f.input :parent_id, as: :hidden, value: params[:parent_id]
= f.input :country_iso, as: :country, :iso_codes => true, priority: ["gb"]
= f.input :prefix
= f.submit
--
路线
或者,您必须确保能够为表单创建正确的路由(因为我认为 @parent = Parent.find params[:parent_id]
没有被调用您的创建
方法:
#app/views/clever_phones/new.html.erb
= simple_form_for [@parent, @clever_phone] do |f|
这将使您能够将 create
操作指向路线的嵌套版本;因此为您提供 parent_id
参数
--
写完后,我认为这并不能解决您问题的核心。如果您需要更多信息,请发表评论,我将很乐意创建更合适的答案!
关于ruby-on-rails - 没有nested_form的has_one关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25380743/