使用Rails MailForm Gem时出现错误消息 - 未定义方法'contacts_path

时间:2015-08-14 13:36:20

标签: ruby-on-rails forms mail-form

我们正在尝试使用Rails MailForm Gem为我们的应用程序中的每个露营地实例生成一个联系表单,以便当用户完成表单时,会直接从表单向营地站点所有者发送电子邮件。

我们已经在routes.rb中的站点资源中嵌套了联系人的资源 - 以确保表单位于路径 - localhost:3000 / sites / 1 / contacts / new而不是localhost:3000 / contacts / new。

我们的应用程序中是否存在一些关键缺失或者我们是否应该以不同的方式处理此问题?建议表示赞赏。

我们的代码是

resources :campsites do resources :contacts end

但是,尝试查看此路径时收到错误。报告的错误状态 undefined method "contacts_path' for #<#<Class:0x007ff0ed9527d0>:0x007ff0ed950de0>我们不确定原因。

我们一直在关注此演练(https://rubyonrailshelp.wordpress.com/2014/01/08/rails-4-simple-form-and-mail-form-to-make-contact-form/)。

我们已经审核了gem和Rails文档,但经过多次尝试后仍然无法查看表单,我们不确定是否与我们尝试在应用程序中查看表单的位置有关

运行localhost:3000 / sites / 1 / contacts / new时,我们收到以下错误:

NoMethodError in Contacts#new
Showing /Users/elinnet/makers/week11/campFri/app/views/contacts/new.html.erb where line #4 raised:

undefined method 'contacts_path' for #<#<Class:0x007ff0ed9527d0>:0x007ff0ed950de0>
Extracted source (around line #4):

(1) <h3>Send A message to Us</h3>

(2) <%= simple_form_for @contact, :html => {:class => 'form-horizontal' } do |f| %>
(3) <%= f.input :name, :required => true %>
(4) <%= f.input :email, :required => true %>
(5) <%= f.input :message, :as => :text, :required => true %>

联系人的控制器是:

class ContactsController < ApplicationController
    def new
     @contact = Contact.new
    end

    def create
     @contact = Contact.new(params[:contact])
     @contact.request = request
     if @contact.deliver
       flash.now[:notice] = 'Thank you for your message. We will contact you soon!'
     else
       flash.now[:error] = 'Cannot send message.'
       render :new
     end
   end
end

联系人模型是:

class Contact < MailForm::Base
   attribute :name, :validate => true
   attribute :email, :validate => /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\z/i
   attribute :message
   attribute :nickname, :captcha => true


  def headers
  {
  :subject => "My Contact Form",
  :to => "your_email@example.org",
  :from => %("#{name}" <#{email}>)
  }
  end
end

项目Github参考是:https://github.com/elinnet/camping.git

2 个答案:

答案 0 :(得分:0)

您的路线是

resources :campsites do 
  resources :contacts 
end

因此,您必须将数组中的两个参数传递给您的表单,如下所示:

<%= simple_form_for [@campsite, @contact], :html => {:class => 'form-horizontal' } do |f| %>

你在控制器中的新动作应该类似于:

def new
 @campsite = Campsite.find(params[:campsite_id]
 @contact = @campsite.contacts.build
end

答案 1 :(得分:0)

您需要在url方法中传递simple_form_for

<%= simple_form_for @contact, url: correct_url_here :html => {:class => 'form-horizontal' } do |f| %>

运行rake routes以找到正确的网址:

以下是从docs中提取url的内容。

  

:url - 要提交表单的网址。这可以用与传递给url_for或link_to的值相同的方式表示。例如,您可以直接使用命名路由。当模型由字符串或符号表示时,如上例所示,如果未指定:url选项,默认情况下表单将被发送回当前url(我们将在下面描述一个替代的面向资源的用法form_for,其中不需要明确指定URL。

如果您想自己查看,请点击link