我正在尝试从帐户对象的“显示”页面创建新的联系人对象。我知道以下代码不正确。如果我在帐户的“显示”页面上,如何将该帐户ID传递给新的联系表单,以便我可以创建属于该帐户的新联系人?
联系 belongs_to 帐户
帐户 has_many 通讯录
帐户“显示”视图,其中包含指向新联系人的链接
<%= link_to "Add Contact", new_account_contact_path(@account), class: 'btn' %>
通过建议编辑“新建,创建”操作
与Controller联系class ContactsController < ApplicationController
before_filter :authenticate_user!
before_filter :load_account
respond_to :html, :json
...
def create
@contact = @account.contacts.new(params[:contact])
if @contact.save
redirect_to account_path(params[:account]), notice: "Successfully created Contact."
else
render :new
end
end
def new
@contact = @account.contacts.new
end
...
end
新联系表单
<%= simple_form_for(@contact) do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<%= f.input :firstname %>
<%= f.input :lastname %>
<%= f.input :email %>
<%= f.input :phone %>
<%= f.input :note %>
</div>
<div class="form-actions">
<%= f.button :submit %>
</div>
<% end %>
错误
undefined method `contacts_path' for #<#<Class:0x007f86c0c408d0>:0x007f86c0be7488>
Extracted source (around line #1):
1: <%= simple_form_for(@contact) do |f| %>
2: <%= f.error_notification %>
3:
4: <div class="form-inputs">
答案 0 :(得分:2)
根据new_account_contact_path(@account)
的存在来判断,我会假设您在routes.rb
中有类似的内容:
resources :accounts do
resources :contacts
end
如果是这种情况,您的contacts#create
路线(以及每条contact
路线)将包含:account_id
参数。您可以添加before_filter
以自动加载ContactsController
中每个操作中的帐户,因此您始终拥有相关的帐户对象:
before_filter :load_account
def load_account
@account = Account.find(params[:account_id])
end
然后在新的和创建动作中,在关系上构建对象是一件简单的事情:
def new
@contact = @account.contacts.new
end
def create
@contact = @account.contacts.new(params[:contact])
....
end
此外,我从未使用simple_form_for
,但是我觉得你可能还需要传递@account
作为参数,以便表单知道要发布的网址。
答案 1 :(得分:0)
我假设您的路线看起来像
resources :accounts do
resources :contacts
end
这样,new_account_contact_path(@account)
会生成类似/accounts/SOME_ID/contact/new
的网址。
在ContactsController
中,您将可以通过params[:account_id]
访问帐户ID,因此为已知帐户创建联系人的正确方法是
def new
@account = Account.find(params[:account_id])
@contact = @account.contacts.build(params[:contact])
end
def create
@account = Account.find(params[:account_id])
@contact = @account.contacts.build(params[:contact])
# some stuff
end
答案 2 :(得分:-1)
您应该更改new
操作:
def new
@account = Account.find(params[:account])
@contact = Contact.new
end
并以new
形式:
<%= simple_form_for(@contact) do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<%= f.input :firstname %>
<%= f.input :lastname %>
<%= f.input :email %>
<%= f.input :phone %>
<%= f.input :note %>
<%= f.input :account_id, :as => :hidden, :input_html => { :value => @account.id } %>
</div>
<div class="form-actions">
<%= f.button :submit %>
</div>
<% end %>