2017-01-22 17 views
0

不要なテーブルを生成しないように、私はactivemodelで 'contact me'フォームを作成しようとしています。私はコンタクトフォームを送信すると、レールは以下の路線にもかかわらず、エラーNo route matches [POST] "/contact/new"を返しRails activemodel&actionmailer私のフォームに連絡するフォームは返されません[POST]

configが/ routes.rbを

resources :contact, only: [:new, :create] 

rake routes戻り、次の...

contact_index POST /contact(.:format)      contact#create 
    new_contact GET /contact/new(.:format)     contact#new 

コントローラ/ contact_controllerを.rb

class ContactController < ApplicationController 

    def new 
    @contact = Contact.new 
    end 

    def create 
    @contact = Contact.new(params[:contact]) 
    if @contact.valid? 
     ContactMailer.contact_submit(@contact).deliver 
     flash[:notice] = "Thank you for your email, I'll respond shortly" 
     redirect_to new_contact_path 
    else 
     render :new 
    end 
    end 
end 

mailers/cont

class ContactMailer < ActionMailer::Base 
    default to: ENV[EMAIL_ADDRESS] 

    def contact_submit(msg) 
    @msg = msg 
    mail(from: @msg.email, name: @msg.name, message: @msg.message) 
    end 
end 

モデル/ contact.rb

class Contact 
    include ActiveModel::Validations 
    include ActiveModel::Conversion 
    extend ActiveModel::Naming 

    attr_accessor :name, :email, :message 

    validates_format_of :email, :with => /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\z/i 
    validates_presence_of :message 
    validates_presence_of :name 

    def initialize(attributes = {}) 
    attributes.each do |name, value| 
     send("#{name}=", value) 
    end 
    end 

    def persisted? 
    false 
    end 
end 

ビュー/連絡先/ new.html.erb

<%= form_for @contact, url: new_contact_path do |f| %> 
    <div class="form-inputs"> 
    <div class="form-group"> 
     <%= f.label :name %><br> 
     <%= f.text_field :name %> 
    </div> 
    <div class="form-group"> 
     <%= f.label :email %><br> 
     <%= f.email_field :email %> 
    </div> 
    <div class="form-group"> 
     <%= f.label :message %><br> 
     <%= f.text_area :message %> 
    </div> 
    </div> 
    <div class="form-actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

答えて

1

リソースを宣言するときは、複数の形式を使用する必要があります

resources :contacts, only: [:new, :create] 

これは、リソースの集合で操作しているというRESTfulなアイデアになります。

contacts_pathにはnew_contacts_pathが書かれています。 neweditアクションはGETに応答し、フォームをフォームにレンダリングします。

は、実際にはあなただけの構成上form_forと利用規約にレコードを渡すことができます。

<%= form_for(@contact) %> 
    # ... 
<% end %> 

これは自動的にルーティングcontacts_pathするに。レールのフォームのURLを手動で設定することはめったにありません。

+0

本当に単一リソースを使用したい場合は、代わりに 'resource'マクロを使用してください。正しいルート名を生成します。 – max

1

act_mailer.rbあなたは、その(/contact/newnew_contact_pathにフォームを送信しています方法はGETであり、POSTではありません。既定では、form_forは、methodpostに設定されたフォームを作成します。

投稿すると、レールはnew_contact_pathと存在しないPOST動詞を探しているので、ルートは一致しません。

urlオプションをform_forから削除します。

<%= form_for @contact do |f| %> 
    # form elements 
<% end %> 

Railsはフォームが動作するように上記のコードについてcontacts_path/contacts

に提出され、提出するURLの世話をする、あなたのルート定義は次のようになります。

resources :contacts, only: [:new, :create] 
関連する問題