Values not being being reflected on page after validation error but model has the values

I have a relationship where a merchant can have multiple payments. I am posting payments to a merchant and there is a validation error. Payment object does have the values retained. Can some one help me fix the issue?

View Code->

<%= @merchant.name %>

<%= form_for([@merchant, @merchant.payments.build]) do |f| %>

<% if @payment.errors.any? %>

<h2><%= pluralize(@payment.errors.count, "error") %> prohibited this payment from being saved:</h2>

<ul>

	<% @payment.errors.full_messages.each do |msg| %>

	<li>

		<%= msg %>

	</li>

	<% end %>

</ul>

<% end %>

test

// Prints the values correctly

<%= @payment.credit_card_number %>

<%= @payment.zip %>

<%= @payment.country %>

<%= f.label :credit_card_number   %>

<br />

<%= f.text_field :credit_card_number , :autocomplete => "off" %>
<%= f.label :address_line_2 %>

<br />

<%= f.text_field :address_line_2 %>
<%= f.label :city %>

<br />

<%= f.text_field :city %>
<%= f.label :zip %>

<br />

<%= f.text_field :zip %>
<%= f.label :country %>

<br />

<%= f.text_field :country %>
<%= f.submit %>

<% end %>

Controller code->

class PaymentsController < ApplicationController

GET /merchants/1

GET /merchants/1.json

def new

@payment = Payment.new

@merchant = Merchant.find(params[:merchant_id])

respond_to do |format|

format.html # show.html.erb

end

end

def index

if params[:merchant_id]

@payments = Merchant.find(params[:merchant_id]).payments

else

@payments = Payment.all

end

respond_to do |format|

format.html # index.html.erb

format.json { render json: @merchants }

end

end

def create

@merchant = Merchant.find(params[:merchant_id])

@payment = @merchant.payments.create(params[:payment])

respond_to do |format|

if @merchant.save

format.html {redirect_to merchants_path}

else

format.html { render action: “new” }

end

end

end

end

I have a relationship where a merchant can have multiple payments. I am posting payments to a merchant and there is a validation error. Payment object does have the values retained. Can some one help me fix the issue?

View Code->

<%= @merchant.name %>

<%= form_for([@merchant, @merchant.payments.build]) do |f| %>

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

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

test // Prints the values correctly <%= @payment.credit_card_number %> <%= @payment.zip %> <%= @payment.country %>

<div class="field"> <%= f.label :credit_card_number %> <br /> <%= f.text_field :credit_card_number , :autocomplete => "off" %> </div> <div class="field"> <%= f.label :address_line_2 %> <br /> <%= f.text_field :address_line_2 %> </div> <div class="field"> <%= f.label :city %> <br /> <%= f.text_field :city %> </div> <div class="field"> <%= f.label :zip %> <br /> <%= f.text_field :zip %> </div> <div class="field"> <%= f.label :country %> <br /> <%= f.text_field :country %> </div>

<div class="actions"> <%= f.submit %> </div> <% end %>

Controller code->

class PaymentsController < ApplicationController   # GET /merchants/1   # GET /merchants/1.json   def new     @payment = Payment.new     @merchant = Merchant.find(params[:merchant_id])     respond_to do |format|       format.html # show.html.erb     end   end

  def index

    if params[:merchant_id]       @payments = Merchant.find(params[:merchant_id]).payments     else       @payments = Payment.all     end

    respond_to do |format|       format.html # index.html.erb       format.json { render json: @merchants }     end   end

  def create     @merchant = Merchant.find(params[:merchant_id])     @payment = @merchant.payments.create(params[:payment])

    respond_to do |format|       if @merchant.save         format.html {redirect_to merchants_path}       else         format.html { render action: "new" }

      end     end

  end

end

what error do you get?

No error . Validation error is populated but form does not retain values. Payment object has the values though.

No error . Validation error is populated but form does not retain values. Payment object has the values though.

This is still confusing. What exactly do you want to do?

   - Show the validation errors on the form page?    - Fix the payment process because you don't know what validations are    failing?    - retain the values passed by the user when validations fail?

No error . Validation error is populated but form does not retain values. Payment object has the values though.

This is still confusing. What exactly do you want to do?

  • Show the validation errors on the form page? → Yes, it is being displayed
  • Fix the payment process because you don’t know what validations are failing? No, I know the validations are failing
  • retain the values passed by the user when validations fail? Yes. The form is not displayed the retained values. I want this to be fixed.

I have a relationship where a merchant can have multiple payments. I am posting payments to a merchant and there is a validation error. Payment object does have the values retained. Can some one help me fix the issue?

View Code->

<%= @merchant.name %>

<%= form_for([@merchant, @merchant.payments.build]) do |f| %>

<% if @payment.errors.any? %>

<h2><%= pluralize(@payment.errors.count, "error") %> prohibited this payment from being saved:</h2>
<ul>
  <% @payment.errors.full_messages.each do |msg| %>
  <li>
  	<%= msg %>
  </li>
  <% end %>
</ul>

<% end %>

test

// Prints the values correctly

<%= @payment.credit_card_number %>

<%= @payment.zip %>

<%= @payment.country %>

<%= f.label :credit_card_number   %>
<br />
<%= f.text_field :credit_card_number , :autocomplete => "off" %>
<%= f.label :address_line_2 %>
<br />
<%= f.text_field :address_line_2 %>
<%= f.label :city %>
<br />
<%= f.text_field :city %>
<%= f.label :zip %>
<br />
<%= f.text_field :zip %>
<%= f.label :country %>
<br />
<%= f.text_field :country %>
<%= f.submit %>

<% end %>

Controller code->

class PaymentsController < ApplicationController

GET /merchants/1

GET /merchants/1.json

def new

@payment = Payment.new

@merchant = Merchant.find(params[:merchant_id])

respond_to do |format|

format.html # show.html.erb

end

end

def index

if params[:merchant_id]

@payments = Merchant.find(params[:merchant_id]).payments

else

@payments = Payment.all

end

respond_to do |format|

format.html # index.html.erb

format.json { render json: @merchants }

end

end

def create

@merchant = Merchant.find(params[:merchant_id])

@payment = @merchant.payments.create(params[:payment])

respond_to do |format|

if @merchant.save

format.html {redirect_to merchants_path}

else

format.html { render action: “new” }

end

end

end

end

You received this message because you are subscribed to the Google Groups “Ruby on Rails: Talk” group.

To post to this group, send email to rubyonra...@googlegroups.com.

To unsubscribe from this group, send email to rubyonrails-ta...@googlegroups.com.

To view this discussion on the web visit https://groups.google.com/d/msg/rubyonrails-talk/-/jSZvC8ID4ycJ.

For more options, visit https://groups.google.com/groups/opt_out.

visit my blog at http://jimlabs.heroku.com

No error . Validation error is populated but form does not retain values. Payment object has the values though.

This is still confusing. What exactly do you want to do?

   - Show the validation errors on the form page? -> Yes, it is being    displayed    - Fix the payment process because you don't know what validations are    failing? No, I know the validations are failing    - retain the values passed by the user when validations fail? Yes.    The form is not displayed the retained values. I want this to be fixed.

It would've helped if you somehow bolded your answers. anyway, you should be able to do that by changing this line

<%= form_for([@merchant, @merchant.payments.build]) do |f| %>

to

<%= form_for([@merchant, @payment]) do |f| %>

Good luck!

Thank you very much. I will read up on the difference. Sorry should have bolded my answers.

Thank you very much. I will read up on the difference. Sorry should have bolded my answers.

No worries. If you're looking for the difference, @payment (as you already know) uses the same record as the one you have in your controllers. If you use @merchant.payments.build, you're creating a new payment record which does not contain the values submitted by the user :slight_smile:

Thank you very much. I will read up on the difference. Sorry should have bolded my answers.

No worries. If you're looking for the difference, @payment (as you already know) uses the same record as the one you have in your controllers. If you use @merchant.payments.build, you're creating a new payment record which does not contain the values submitted by the user :slight_smile:

regarding your question on the field_error_proc. read this one and please don't email users directly :slight_smile:

thanks :slight_smile: