创建具有belongs_to关系的新记录,并传递其所属模型的ID

时间:2013-05-15 17:54:20

标签: ruby-on-rails forms controller

我正在尝试从帐户对象的“显示”页面创建新的联系人对象。我知道以下代码不正确。如果我在帐户的“显示”页面上,如何将该帐户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">

3 个答案:

答案 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 %>