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
Post a Comment