has_one关系没有nested_form

时间:2014-08-19 10:08:19

标签: ruby-on-rails simple-form has-one

我正在尝试通过基本形式实现has_one关系,并且完全陷入困境。

我似乎已经在控制器和表单中尝试了大量的事物组合,但似乎没有任何进展。

我有一个电话号码,我使用由api填充的外部服务。

最终我想为此设置所有这种类型的电话号码,但是现在我很乐意让一个人工作。

parent.rb

has_one :clever_phone

和手机型号

clever_phone.rb

attr_accessible :number, :parent_id, :prefix, :country_iso
belongs_to :parent

控制器

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生成用于创建的信息,我认为,正好位于clever_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的参数似乎没有被传递给控制器​​中的create方法,因此我得到了一个     '没有身份证找不到父母' 错误

如果我尝试将其作为嵌套表单 我明白了     NoMethodError未定义方法'parent_clever_phones_path' 实际上我没有使用过,只有parent_clever_phone_path(注意没有复数)。

我确信这应该非常简单,但我已经盯着它好几个小时了,而且我已经在我的系绳结束了......

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

好的,你需要争辩几个问题:

-

<强>可变

@parent参数没有被传递的原因是因为您没有将它们包含在您的表单中。这就是为您的表单嵌套非常方便的地方 - 通过一次调用传递您的parent参数和clever_phone参数

由于您不想这样做,我建议至少使用与hidden field相关联的parent_id填充clever_phone

#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]方法未调用create

#app/views/clever_phones/new.html.erb
= simple_form_for [@parent, @clever_phone] do |f|

这样,您就可以将create操作指向路径的嵌套版本;因此为你提供parent_id参数

-

写完后,我不认为它会解决你问题的核心。如果您需要更多信息,请写评论&amp;我很乐意努力创造一个更恰当的答案!

答案 1 :(得分:1)

正确:值得投入最终有效的解决方案。 感谢Rich Peck让我到了那里... 模特

parent.rb
  has_one :clever_phone

clever_phone.rb
  belongs_to :parent  

视图

simple_form_for @clever_phone, url: parent_clever_phone_path(@parent) do |f|

-----
f.input :parent_id, :value: @parent.id
-----

路由

 resources :parent do
   resource :clever_phone

控制器

def new 
....
@parent = Parent.find(params[:parent_id])
@clever_phone = @parent.build_clever_phone

def create
@parent = Parent.find(params[:parent_id]
@clever_phone = CleverPhone.new(params[:clever_phone]

除非你使用build_clever_phone,否则不会填充parent_id。我无法让@ parent.create_clever_phone工作,但这似乎可以解决问题......

希望能节省一天工作......