0

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

4

2 回答 2

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
于 2015-08-14T14:03:36.683 回答
0

您需要传入方法urlsimple_form_for

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

运行rake routes以找到正确的 url:

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

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

如果你想自己去看看,这里是链接

于 2015-08-14T14:04:10.530 回答