0

わかりました、この問題を解決する方法について少し混乱しました。

私は 1 つのフォームと 2 つのモデルを持っています。ここに私のフォームがあります:

<% if @booking.errors.any? %>
  <% @booking.errors.full_messages.each do |msg| %>
    <p class="error"><%= msg %></p>
  <% end %>
<% end %>

<% if @guest.errors.any? %>
  <% @guest.errors.full_messages.each do |msg| %>
    <p class="error"><%= msg %></p>
  <% end %>
<% end %>

<%= form_for :booking, url: bookings_path do |f| %>
  <%= label_tag :email, "Guest's Email Address" %>
  <%= text_field_tag :email %>
  <%= f.label :nights, "Nights" %>
  <%= f.text_field :nights %>
  <%= f.label :nights, "People" %>
  <%= f.text_field :people %>
  <%= f.label :nights, "Arrival Date" %>
  <%= f.text_field :arrival %>
<% end %>

ご覧のとおり、メール フィールドはフォーム ビルダーの一部ではありません。電子メール アドレスがまだ存在しない場合、新しいゲスト レコードを作成するために電子メール アドレスが使用されます。ゲストのIDを取得したら、予約記録も作成できます。

これが私のBookingControllerの作成アクションのコードです-フォームが送信される場所...

...

def create
  accommodation = current_user.accommodation
  guest = Guest.find_or_create_by(:email => params[:email])
  @booking = accommodation.bookings.new(post_params.merge(:guest_id => guest.id))

  if @booking.save
    flash[:success] = 'The booking has been added successfully.'  
    redirect_to :controller => 'bookings', :action => 'index'
  else
    render 'new'
  end
end

...

この質問は新しいものではないことは承知していますが、私の問題に対する適切な解決策がどこにも見つかりません。(必要に応じて) フォームを適切に設定し、2 つのモデルを使用してすべてのフィールドを検証できるようにしたいと考えています。次に、エラー メッセージを表示する必要があります。現在、私の電子メールは検証中に無視され、次に何をすればよいかわかりません。

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

4

2 に答える 2

1

最も簡単な方法は、コントローラー自体で電子メールを検証し、検証エラーを予約変数に追加することです。このようなもの:

def create
  accommodation = current_user.accommodation
  guest = Guest.find_or_create_by(:email => params[:email])
  @booking = accommodation.bookings.new(post_params.merge(:guest_id => guest.id))

  if @booking.save
    flash[:success] = 'The booking has been added successfully.'  
    redirect_to :controller => 'bookings', :action => 'index'
  else
    <% if params[:email].blank> %>
       @booking.errors.add(:email, "can't be blank.")
    <% end %>

    #You can do the same thing for whatever other validation errors you have

    render 'new'
  end
end

注:コードはテストしていません

これはおそらく最良の方法ではありませんが、仕事は簡単に完了します。accept_nested_attributes_for を使用できますが、電子メールのみを検証していることを考えると、少し不必要に思えます。それにもかかわらず、最もクリーンな方法で行いたい場合は、accept_nested_attributes_for を使用してください。

編集

実際、あなたのコードは正しい軌道です。構文エラーが発生しました。ゲスト エラーが表示されない本当の理由は、インスタンス変数の代わりにローカル変数を使用したことです。これを試して:

@guest = Guest.find_or_create_by(:email => params[:email])

エラーメッセージは、既に持っているコードで表示されるはずです

<% if @guest.errors.any? %>
  <% @guest.errors.full_messages.each do |msg| %>
    <p class="error"><%= msg %></p>
  <% end %>
<% end %>

編集2

ゲストの電子メールが無効な場合に予約インスタンスが保存されないようにするには、次のようにします。

if !@guest.errors.any? && @booking.save
    flash[:success] = 'The booking has been added successfully.'  
    redirect_to :controller => 'bookings', :action => 'index'
  else

したがって、ゲストにエラーがある場合、if ステートメントは @booking.save ステートメントが実行される前に終了します。

于 2013-09-13T20:25:43.913 に答える
0

取引を試みることができます。それらのいずれかが無効な場合、レールはロールバックを実行し、エラーをレンダリングできます。

この質問コードに従って、役立つかどうかを確認してください。

于 2013-09-13T20:03:20.440 に答える