Rails: rendering a collection after an object in that collection fails validation -


let's have following models

models/user.rb

class user   has_many :degrees end 

models/degree.rb

class degree   attr_accessible :name    belongs_to :user    validates :name, :presence => true end 

within users#show want display users degrees , provide form creating new one.

views/users/show.html.erb

...  current degrees: <%= render @user.degrees %>  add new degree: <%= form_for degree.new |f| %>   <%= f.text_field :name %>   <%= f.submit "submit" %> <% end %>  ... 

views/degrees/_degree.html.erb

... <%= degree.name %> 

so inside degrees_controller.rb have

controllers/degrees_controller.rb

class degreescontroller < applicationcontroller    # ...    def create     degree = current_user.degrees.build(params[:degree])      if degree.save       redirect_to # somewhere flash message     else       render "users#show"     end   end end 

the problem in call render @user.degrees inside views/users/show.html.erb after degree has failed validation. if submit form without providing name, degree object persists in memory after render method called, , render views/degrees/_degree.html.erb partial invalid object. partial calls name method, throws nil error.

i can throw conditionals in view (i.e., unless degree.name.nil?), smells me. if attributes on degree object grow, partial contain way conditional logic.

any thoughts?

try this,

<%= render @user.degrees.delete_if(&:new_record?) %> 

this stop unsaved records being rendered in partial removing them array of degrees.

it cleaner move controller,

@user_degrees = current_user.degrees.delete_if(&:new_record?) 

then in view,

<%= render @user_degrees %> 

Comments

Popular posts from this blog

authentication - Mongodb revoke acccess to connect test database -

r - Update two sets of radiobuttons reactively - shiny -

ios - Realm over CoreData should I use NSFetchedResultController or a Dictionary? -