0

アカウント オブジェクトの「表示」ページから新しい連絡先オブジェクトを作成しようとしています。以下のコードが正しくないことはわかっています。アカウントの「表示」ページにいる場合、そのアカウント ID を新しい連絡先フォームに渡して、そのアカウントに属する新しい連絡先を作成するにはどうすればよいですか?

連絡先はアカウントに属します

アカウントhas_many連絡先

新しい連絡先へのリンクがあるアカウントの「表示」ビュー

<%= link_to "Add Contact", new_account_contact_path(@account), class: 'btn' %>

提案された編集を伴うコントローラーへの連絡 「新規、作成」アクション

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">
4

3 に答える 3

2

の存在から判断すると、あなたのnew_account_contact_path(@account)には次のようなものがあると思いますroutes.rb:

resources :accounts do
  resources :contacts
end

その場合、contacts#createルート (およびすべてのcontactルート) にはパラメーターが含まれます:account_idbefore_filterのすべてのアクションでアカウントを自動的にロードするようにを追加するとContactsController、常に関連するアカウント オブジェクトを使用できます。

before_filter :load_account

def load_account
  @account = Account.find(params[:account_id])
end

次に、 new アクションと create アクションでは、リレーションでオブジェクトを構築するだけです。

def new
  @contact = @account.contacts.new
end 

def create
  @contact = @account.contacts.new(params[:contact])
  ....
end

また、私は を使用したことはありませんが、フォームが投稿先の URL を認識できるように、パラメーターとしてsimple_form_for渡す必要があるかもしれないことに気づきました。@account

于 2013-05-15T18:06:33.503 に答える
0

私はあなたのルートが次のように見えると仮定しています

resources :accounts do
  resources :contacts
end

このようにnew_account_contact_path(@account)すると、 のような URL が生成されます/accounts/SOME_ID/contact/new

ではContactsController、 経由でアカウント ID にアクセスできるparams[:account_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
于 2013-05-15T18:06:06.743 に答える