0

Web ページのフッターにあるメーリング リストにサインアップするためのフォームを作成したいと考えています。私が行ったのは、この小さなフォームをアプリケーション レイアウトのフッターにレンダリングするパーシャルを作成することでした。

パーシャルのコードは次のとおりです。

<%= form_for(@mailing_list) do |f| %>
  <% if @mailing_list.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@mailing_list.errors.count, "error") %> prohibited this mailing_list from being saved:</h2>

      <ul>
      <% @mailing_list.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :first_name %><br />
    <%= f.text_field :first_name %>
  </div>
  <div class="field">
    <%= f.label :last_name %><br />
    <%= f.text_field :last_name %>
  </div>
  <div class="field">
    <%= f.label :email %><br />
    <%= f.text_field :email %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

私はまだレールを学んでいるので、足場から生成されたコードです。私が集めたものから、 @mailing_list = MailingList.new で @mailing_list 変数をインスタンス化する必要がありますが、ここでの問題は、必ずしもそのページにアクセスしているわけではないため、メーリング リスト コントローラーの NEW アクションが呼び出されないことです。このフォームは各ページのフッターにあります。

このフォームを作成する適切な方法は何でしょうか? すべてのコントローラーで MailingList.new を呼び出さずにこれを行う方法はありますか?

ありがとう!

4

2 に答える 2

2

フォームをこれに変更します

<%= form_for MailingList.new, html: { remote: true } do |f| %>

したがって、インスタンス変数について心配する必要はありません。remote: trueまた、フォームが ajax 経由で送信されるように渡す必要があります。create.js.erbエラーを表示するには、 underという名前のファイルを作成しapp/views/mailing_lists、以下を追加します (フォームの前にエラーを追加する単純なスクリプト)。

$('.error-messages').remove();
<% if @mailist_list.errors.any? %>
  $('#new_mailing_list').before('<ul class="error-messages"></ul>');
  <%= @mailing_list.errors.full_messages.each do |msg| %>
    $('.error-messages').append('<li><%= escape_javascript msg %></li>');  
  <% end %>
<% end %>
于 2013-03-18T00:36:53.147 に答える
0

form_forメソッドを次のように変更できます。

<%= form_for :mailing_list, url: mailing_lists_path do |f| %>

@mailing_listそうすれば、ページごとに初期化する必要がなくなります。

注意点は、フッターにエラーをレンダリングできないことです。質問のコードを使用してビューを作成する必要がありますnew.html.erb。これは、作成アクションで保存するときにエラーが発生した場合にレンダリングできます。

于 2013-03-17T22:47:48.690 に答える