Home > Software design >  How can I check if all model records are true in view?
How can I check if all model records are true in view?

Time:08-25

I need to check if all of my Campaign Designs are is_validated in my view in order to show some snippet:

Asociations

Campaign has_many designs

Design belongs to Campaign

Design model

scope :validated, -> { where('is_validated >= ?', true) }

My view

<% if @campaign.designs.validated %>
  <i ></i>
<% else %>
  <i ></i>
<% end %>

I can't get this to work. Am I missing something?

Thanks!!!

CodePudding user response:

Assuming @campaign is an instance of the Campaign model. The method in your view just gives you a list of validated campaigns.

You want to know if they're all validated. So turn it around and determine if a) there are more than zero campaigns, and b) if any are not validated.

It's not good practice to put this logic in the view, so in the controller, do something like this:

# app/models/campaign.rb

scope :not_validated, ->{ where(is_validated: false) }

def self.all_validated
  !count.zero? && !not_validated.count.zero?
end

# campaign_controller.rb

def show
  @all_validated = Campaign.all_validated
end

# show.html.erb
<% if @all_validated %>
  <i ... ></i>
<% else %>
  <i ... ></i>
<% end %>

but actually, it's my preference to reduce the logic in the view still further and put it in the css like this:

# the view
<i  data-allValidated = <%= @all_validated %> ></i>

# the css
[data-allValidated='true']{
  color: green;
}
[data-allValidated='false']{
  color: red;
}
  • Related