0

私は Rails 3.2.11 アプリケーションを持っており、メールを送信したばかりの contact という名前のビューに連絡先フォームがあります。ロジックはうまく機能していました。ここで、PostgreSQL データベースを使用してフォームの内容を ReceivedEmail モデルに保存することにしました。

form_tag フォームを form_for @received_email フォームに変更しました。ここに私の form_for ビューがあります:

<%= form_for(@received_email) do |f| %>
  <p class="radio-buttons">
    <span class="label1"><%= f.label "Select one: (required)" %></span>
    <%= f.radio_button :purpose, '1' %><span class="label2"><%= f.label :purpose_order, 'My Order' %></span>
    <%= f.radio_button :purpose, '2' %><span class="label3"><%= f.label :purpose_special, 'Quote For Special Order' %></span>
    <%= f.radio_button :purpose, '3' %><span class="label4"><%= f.label :purpose_wholesale, 'Wholesale Discounts' %></span>
    <%= f.radio_button :purpose, '4' %><span class="label5"><%= f.label :purpose_church, 'Store/Church Discounts' %></span>
    <%= f.radio_button :purpose, '5' %><span class="label6"><%= f.label :purpose_other, 'General Inquiry' %></span>
  </p><br><br>
  <%= f.label "First Name (required)" %><%= f.text_field :first_name, :minlength => 2, :maxlength => 30, placeholder: "First Name (max. 30)" %><br>
  <%= f.label "Last Name (required)" %><%= f.text_field :last_name, :minlength => 2, :maxlength => 30, placeholder: "Last Name (max. 30)" %><br>
  <%= f.label "Email (required)" %><%= f.text_field :email, :minlength => 2, :maxlength => 60, placeholder: "Valid Email Address (max. 60)" %><br>
  <%= f.label "Order Number" %><%= f.text_field :order, :minlength => 2, :maxlength => 20, placeholder: "Order #  (max. 20)" %><span class="contact-required">Required for My Order</span><br>
  <%= f.label "Business / Organization" %><%= f.text_field :company, :minlength => 2, :maxlength => 30, placeholder: "Business/Organization Name (max. 30)" %><span class="contact-required">Required for Wholesale Discounts & Store/Church Discounts</span><br>
  <%= f.label "Business / Organization Website" %><%= f.text_field :website, :minlength => 2, :maxlength => 70, placeholder: "Company Website (max. 70)" %><br>
  <%= f.label "More Info About You" %><%= f.text_area :about_you, :minlength => 10, :maxlength => 255, placeholder: "More Info About You and/or Your Organization (max. 255.)" %>
  <span class="contact-required">Required for Wholesale Discounts & Store/Church Discounts</span><br>
  <%= f.label "Address (required)" %><%= f.text_field :address, :minlength => 2, :maxlength => 50, placeholder: "Street Address (max. 50)" %><br>
  <%= f.label "City (required)" %><%= f.text_field :city, :minlength => 2, :maxlength => 30, placeholder: "City (max. 30)" %><br>
  <%= f.label "State (required)" %><%= f.text_field :state, :minlength => 2, :maxlength => 30, placeholder: "State/Province (max. 30)" %><br>
  <%= f.label "Postal Code / Zip (required)" %><%= f.text_field :zip, :minlength => 2, :maxlength => 15, placeholder: "Postal/Zip (max. 15)" %><br>
  <%= f.label "Country (required)" %><%= f.text_field :country, :minlength => 2, :maxlength => 30, placeholder: "Country (max. 30)" %><br>
  <%= f.label "Message (required)" %><%= f.text_area :message, :minlength => 10, :maxlength => 255, placeholder: "Message or Project Information (max. 255)" %><br>
  <%= f.submit "Submit" %>
<% end %>

次に、コントローラー コードに小さな変更を加えました。

if params[:commit]=='Submit'
  if params[:first_name].blank? || params[:last_name].blank? || params[:address].blank? || params[:city].blank? || params[:state].blank? || params[:zip].blank? || params[:country].blank? || 
     params[:message].blank? || params[:purpose].blank? || params[:email].blank? || params[:email] !~ /\A[\w+\-.]+@[\w\-.]+\.[a-z]+\z/i
    flash.now[:error] = "First Name, Last Name, Address, Email, Address, City, State, Postal Code / Zip, Country and Message are required for all emails.  You must also select an email type."
    render 'contact'
  elsif params[:purpose] == '1' && params[:order].blank?
    flash.now[:error] = "Order Number is required when selecting My Order."
    render 'contact'
  elsif (params[:purpose] == '3' || params[:purpose] == '4') && (params[:company].blank? || params[:about_you].blank?)
    flash.now[:error] = "Business / Organization and More Info About You are required when selecting Wholesale Discounts or Store/Church Discounts."
    render 'contact'
  else
    @received_email = ReceivedEmail.new(params[:received_email])
    if @received_email.save
      begin
        HyperCubeOfLoveMailer.inquiry_email(@received_email).deliver
        flash.now[:success] = "The HyperCube Of Love Team has received your inquiry.  You should receive a confirmation email shortly."
      rescue Net::SMTPFatalError, Net::SMTPSyntaxError, Net::SMTPAuthenticationError => pages_error
        logger.warn pages_error
        flash.now[:notice] = "There was a problem with sending your inquiry to the HyperCube Of Love Team.  Please resubmit your inquiry."
      end   
      redirect_to home_path
    else
      render 'contact'
    end
  end
else
  render 'contact'
end

:received_emails を config.rb に追加しました。このコードを最初に実行しようとしたときに、モデルに関連するルートが存在しないというエラーが表示されたためです。

次回、このコードを実行して ReceiveEmail レコードを作成しようとしたときに、received_emails_controller.rb を探していたため、初期化エラーが発生しました。

次に、新しいビューでコントローラーを作成しました。これを実行しようとした後、作成ビューがないというエラーが発生しました。次に、作成ビューを作成しました。どこに行き着いたかを確認するために作成しました。私の作成ビューが表示されました。私は、このようなことをする必要がなかったことを知っています.

現時点で唯一のデータベース アクセスは、このフォームのレコードを追加することです。必要なのは、データをフォームからレコードに移動し、モデルに追加することだけです。

Railsコマンドのチェックを行いました。フォームのすべてのフィールドに対して次のようなことを実行して、レコードを作成できると思います。

ReceiveModel.create(purpose: params[:purpose], first_name: params[:first_name], etc.)

しかし、おそらく params[:received_email] を使用してある種の挿入を行うことができると思いましたが、それを行う方法やこれが可能かどうかはわかりません。

ReceiveModel.create(params[:received_email])

どんな助けでも大歓迎です。

4

1 に答える 1

0

私があなたを正しく理解しているなら、あなたのコントローラーコードにすでにある構造は物事にアプローチする正しい方法です:

@received_email = ReceivedEmail.new(params[:received_email])
if @received_email.save
  # Send the e-mail 
else
  # Re-show the page because something didn't work
end

ただし、実行したいことの90%はRailsスキャフォールディングによってサポートされているため、最初からを開始することをお勧めしますrails generate scaffold ContactMessage purpose:integer first_name:string ...。これにより、連絡先メッセージを作成および確認するためのすべてのコードが提供されます。次に、生成された_form.html.erbを独自のフォームに置き換え、通知の電子メールコードをContactMessageControllerに配置できます。

于 2013-03-05T21:35:28.963 に答える