2017-01-22 12 views
0

불필요한 테이블 생성을 피하기 위해 activemodel을 사용하여 '저에게 연락하십시오'양식을 작성하려고합니다. 나는 문의 양식을 제출하면 레일은 다음과 같은 경로에도 불구하고, 오류 No route matches [POST] "/contact/new"를 반환레일스 activemodel & actionmailer 저에게 연락주세요 경로가 일치하지 않습니다 [POST]

설정은/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 

메일러/cont act_mailer.rb

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_contact_path (/contact/new)에 양식을 제출하고

<%= 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

/연락처/new.html.erb 그 방법이 GET이고 POST이 아님. 기본적으로 form_formethodpost으로 설정된 양식을 구성합니다.

그래서 제출할 때 레일스는 new_contact_pathPOST 동사를 찾고 있으므로 경로가 일치하지 않습니다.

url 옵션을 form_for에서 제거하십시오.

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

레일, 양식이 작동하는 위의 코드를 들어 contacts_path (/contacts)

에 제출됩니다 제출 URL 처리됩니다, 경로의 정의는 다음과 같아야합니다

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