我正在尝试通过基本形式实现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(注意没有复数)。
我确信这应该非常简单,但我已经盯着它好几个小时了,而且我已经在我的系绳结束了......
有什么想法吗?
答案 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工作,但这似乎可以解决问题......
希望能节省一天工作......