activerecord and empty find results

is this the prefered way to render a special rhtml-file if a Record.find leads to an empty result?

  def dummy   @users = User.find(:all, :conditions => "username = 'dsr321'")   if @users.blank?     redirect_to :action => "emptyresult"   end   end

Jochen Kaechelin wrote:

is this the prefered way to render a special rhtml-file if a Record.find leads to an empty result?

  def dummy   @users = User.find(:all, :conditions => "username = 'dsr321'")   if @users.blank?     redirect_to :action => "emptyresult"   end   end

I usually use the same template with some conditional logic to check if the resultset is empty. You could do what you're suggesting if you want a totally different view. Or you could just choose to render another template (IIRC this should do it, check the API otherwise):

render :template => "mycontroller/emptyresult"

Jochen Kaechelin wrote:

is this the prefered way to render a special rhtml-file if a Record.find leads to an empty result?

  def dummy   @users = User.find(:all, :conditions => "username = 'dsr321'")   if @users.blank?     redirect_to :action => "emptyresult"   end   end

I usually use the same template with some conditional logic to check if the resultset is empty. You could do what you're suggesting if you want a totally different view. Or you could just choose to render another template (IIRC this should do it, check the API otherwise):

render :template => "mycontroller/emptyresult"

Ok, but is this the prefered syntax:

if @users.blank?

or should I use something different?

When I render the template with an empty result set I get "nil" but "if @users.nil?" does not work.

Jochen Kaechelin wrote: > is this the prefered way to render a special rhtml-file if a > Record.find leads to an empty result? > > > def dummy > @users = User.find(:all, :conditions => "username = 'dsr321'") > if @users.blank? > redirect_to :action => "emptyresult" > end > end

I usually use the same template with some conditional logic to check if the resultset is empty. You could do what you're suggesting if you want a totally different view. Or you could just choose to render another template (IIRC this should do it, check the API otherwise):

render :template => "mycontroller/emptyresult"

The advice from http://therailsway.com/ is to avoid conditional logic in views with more than one branch. It's OK to say "display x if y" but it's not OK to say "if x, display y, else display z". Based on that, I'd avoid having this decision in the template itself.

I'm not sure what the conventional wisdom is re: whether to redirect to a different action or simply render a different template, but I would (personally) favor rendering the different template unless there was additional preparation necessary which might cloud the meaning of the first action.

David

> > Jochen Kaechelin wrote: >> is this the prefered way to render a special rhtml-file if a >> Record.find leads to an empty result? >> >> >> def dummy >> @users = User.find(:all, :conditions => "username = 'dsr321'") >> if @users.blank? >> redirect_to :action => "emptyresult" >> end >> end > > I usually use the same template with some conditional logic to > check if > the resultset is empty. You could do what you're suggesting if you > want > a totally different view. Or you could just choose to render > another > template (IIRC this should do it, check the API otherwise): > > render :template => "mycontroller/emptyresult"

Ok, but is this the prefered syntax:

if @users.blank?

or should I use something different?

When I render the template with an empty result set I get "nil" but "if @users.nil?" does not work.

Assuming you're doing something like @users = User.find(...), you should have an empty array. If you're doing something different please post it. Otherwise I'd try @users.empty?

Also - you shouldn't be getting nil from @users. Are you explicitly referencing one of them in the view? Like this: @users[0]?

> > Jochen Kaechelin wrote: >> is this the prefered way to render a special rhtml-file if a >> Record.find leads to an empty result? >> >> >> def dummy >> @users = User.find(:all, :conditions => "username = 'dsr321'") >> if @users.blank? >> redirect_to :action => "emptyresult" >> end >> end > > I usually use the same template with some conditional logic to > check if > the resultset is empty. You could do what you're suggesting if you > want > a totally different view. Or you could just choose to render > another > template (IIRC this should do it, check the API otherwise): > > render :template => "mycontroller/emptyresult"

Ok, but is this the prefered syntax:

if @users.blank?

or should I use something different?

When I render the template with an empty result set I get "nil" but "if @users.nil?" does not work.

Assuming you're doing something like @users = User.find(...), you should have an empty array.

I use this one:

unless @users.empty?   redirect_to :action => "list" else   redirect_to :action => "fehler" end

and everything works fine.

If you're doing something different please post it. Otherwise I'd try @users.empty?

Also - you shouldn't be getting nil from @users. Are you explicitly referencing one of them in the view? Like this: @users[0]?

No, I make something like:

@users.each do |u| ....

David Chelimsky wrote:

Jochen Kaechelin wrote:

is this the prefered way to render a special rhtml-file if a Record.find leads to an empty result?

  def dummy       @users = User.find(:all, :conditions => "username = 'dsr321'")       if @users.blank?               redirect_to :action => "emptyresult"       end   end

I usually use the same template with some conditional logic to check if the resultset is empty. You could do what you're suggesting if you want a totally different view. Or you could just choose to render another template (IIRC this should do it, check the API otherwise):

render :template => "mycontroller/emptyresult"

The advice from http://therailsway.com/ is to avoid conditional logic in views with more than one branch. It's OK to say "display x if y" but it's not OK to say "if x, display y, else display z". Based on that, I'd avoid having this decision in the template itself.

Move it into a helper then.

I'm not sure what the conventional wisdom is re: whether to redirect to a different action or simply render a different template, but I would (personally) favor rendering the different template unless there was additional preparation necessary which might cloud the meaning of the first action.

I agree that render is better than redirect to avoid the extra http request. But note that the idea of having different templates / actions based on the number of results in a resultset breaks down as soon as the number of resultsets displayed grows due to the combinatorial explosion.

That is if you wants to display both users and posts you will have to create 4 templates, add another variable and this number grows to 8 - not to mention the logic in the controller to handle this.