【问题标题】:Error message when using Rails MailForm Gem - undefined method 'contacts_path使用 Rails MailForm Gem 时出现错误消息 - 未定义方法“contacts_path”
【发布时间】:2015-08-14 13:36:20
【问题描述】:

我们正在尝试使用 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

【问题讨论】:

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


    【解决方案1】:

    你的路线是

    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
    

    【讨论】:

      【解决方案2】:

      您需要在simple_form_for 方法中传入url

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

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

      这是来自文档的 url 的摘录。

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

      如果您想自己查看,这里是link

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-08
        • 2012-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多