0

Rails 4アプリでメールを送信するようにMailFormを設定しようとしていますが、実際には1つのことを除いて機能しています。

message何らかの理由で、メールにフィールドが含まれていません(フォームにはname,フィールドと非表示フィールドしかemailありません)。messagenickname

私のContactモデルは次のようになります。

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

  append :remote_ip, :user_agent

  def headers
    {
      subject: 'Question',
      to: ENV['ACTION_MAILER_USERNAME'],
      from: %("#{name}" <#{email}>)
    }
  end
end

に追加validate: trueするattribute :messageと、検証が正しく機能しません。つまり、フィールドが空でない場合でも空であると表示されるため、:message属性の検証をオンにすると、フォームを送信することさえできません。

MailForm ドキュメントの例では、:messageフィールドの検証はありませんが、フォームを送信すると、送信されたメッセージには:name:emailフィールドのみが含まれ、 no :message.

ContactsController.rbはこのように見えます:

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

  def create
    @contact = Contact.new(contact_params)
    @contact.request = request
    if @contact.deliver
      flash.now[:notice] = I18n.t('contact.message_success')
      redirect_to root_path
    else
      flash.now[:error] = I18n.t('contact.message_error')
      render :new
    end
  end

  private

  def contact_params
    params.require(:contact).permit(:name, :email, :message)
  end
end

そして、ここに私のhtmlフォームがあります:

   <%= simple_form_for @contact do |f| %>
       <%= f.input :name, required: true, label: false %>
       <%= f.input :email, required: true, label: false %>
       <%= f.input :message, as: :text, required: true, label: false %>
       <div class="hidden">
           <%= f.input :nickname, hint: 'Leave this field blank!' %>
       </div>
       <%= f.button :submit, t('contact.action') %>
   <% end %>

したがって、基本的に、MailForm ドキュメントの例に従いましたが、それでも正しく動作しませんでした。

私が間違っていることを見つけるのを手伝ってもらえますか?

更新 1

問題はパラメータにあるようです。paramsフォームを送信すると、ハッシュは次のようになります。

Parameters: {"utf8"=>"✓", "authenticity_token"=>"kOtHaOTBNvl5KpPBLB31LtQ6W0jUoohg012ZbQ5qyg0fAGW6y5mMR5FSAEcY4kyotFYihTvRSvTtbDsc8oMQ3g==", "contact"=>{"name"=>"Testing", "email"=>"whatever@test.com", "nickname"=>""}, "Message"=>"Hello everyone!", "commit"=>"Send", "locale"=>"en"}
4

1 に答える 1

0

さて、これが私がそれを機能させた方法です:

paramsハッシュは次のようになっているためです。

{"utf8"=>"✓", "authenticity_token"=>"kOtHaOTBNvl5KpPBLB31LtQ6W0jUoohg012ZbQ5qyg0fAGW6y5mMR5FSAEcY4kyotFYihTvRSvTtbDsc8oMQ3g==", "contact"=>{"name"=>"Testing", "email"=>"whatever@test.com", "nickname"=>""}, "Message"=>"Hello everyone!", "commit"=>"Send", "locale"=>"en"}

メッセージ フィールドを取得できませんでした。これを行ったときに、次params.require(:contact)のようなハッシュのみが返されました:{"name"=>"Testing", "email"=>"whatever@test.com", "nickname"=>""}:contact

contact_paramsしたがって、メソッドを次のように変更する必要がありました。

  def contact_params
    params.require(:contact).permit(:name, :email)
                            .merge(message: params.fetch('Message'))
  end

そして今、私が必要とするもの、つまり次のようなハッシュを返します:

{"name"=>"Testing", "email"=>"whatever@test.com", "message"=>"Hello everyone!"}

それが誰かに役立つことを願っています!

于 2016-09-14T10:59:00.117 に答える