如何使用嵌套属性boolean来更改侧边栏中的字体颜色?

时间:2015-04-09 19:52:27

标签: ruby-on-rails ruby conditional

当用户在_form中检查:good时,如何在侧边栏中将该结果的字体颜色呈绿色?

我们在索引中完成了这项工作:How to Change Font Color based on Conditional?

但是侧边栏逻辑通过在我尝试这个时为每个结果呈现额外的量化/结果而变得更加棘手(我们试着在这里解决这个问题:How to stop double rendering in sidebar?):

<% @averaged_quantifieds.each do |averaged| %>
  <% averaged.results.each do |result| %>
    <% if result.good == true %>
      <div class="green">
        <li>
          <%= raw averaged.tag_list.map { |t| link_to t.titleize, tag_path(t) }.join(', ') %><%= link_to edit_quantified_path(averaged) do %> <%= averaged.results.first.result_value %> <%= averaged.metric %> <span class="label label-info"> <%= averaged.results.first.date_value.strftime("%b") %></span><% end %>
        </li>
    <% else %>
      <div class="red">
        <li>
          etc...

当前代码:

<% @averaged_quantifieds.each do |averaged| %>
  <li>
    <%= raw averaged.tag_list.map { |t| link_to t.titleize, tag_path(t) }.join(', ') %><%= link_to edit_quantified_path(averaged) do %> <%= averaged.results.first.result_value %> <%= averaged.metric %> <span class="label label-info"> <%= averaged.results.first.date_value.strftime("%b") %></span><% end %>
  </li>
<% end %>

<% @instance_quantifieds.each do |instance| %>
  <li>
    <%= instance.results.first.date_value.strftime("%b %d") %>: <%= link_to edit_quantified_path(instance) do %> <%= instance.results.first.result_value %> <%= instance.metric %>, <%= raw instance.tag_list.map { |t| link_to t.titleize, tag_path(t) }.join(', ') %><% end %>
  </li>
<% end %>

application_controlller

def set_stats
  @quantifieds = Quantified.joins(:results).all
  @averaged_quantifieds = current_user.quantifieds.averaged if current_user
  @instance_quantifieds = current_user.quantifieds.instance if current_user
  @statsresults = current_user.results.stats if current_user
end

更新

quantified.rb

&#13;
&#13;
class Quantified < ActiveRecord::Base
	belongs_to :user
 	has_many :results #correct
	has_many :comments, as: :commentable
	accepts_nested_attributes_for :results, :reject_if => :all_blank, :allow_destroy => true #correct
 	scope :averaged,  -> { where(categories: 'Averaged') }
 	scope :instance,  -> { where(categories: 'Instance') }
	scope :private_submit, -> { where(private_submit: true) }
	scope :public_submit, -> { where(private_submit: false) }
 	validates :categories, :metric, presence: true
	acts_as_taggable

	CATEGORIES = ['Averaged', 'Instance']
end
&#13;
&#13;
&#13;

量化控制器

&#13;
&#13;
class QuantifiedsController < ApplicationController
  before_action :set_quantified, only: [:show, :edit, :update, :destroy]
  before_action :logged_in_user, only: [:create, :destroy]

  def index
    if params[:tag]
      @quantifieds = Quantified.tagged_with(params[:tag])
    else
      @quantifieds = Quantified.joins(:results).all
      @averaged_quantifieds = current_user.quantifieds.averaged
      @instance_quantifieds = current_user.quantifieds.instance
    end
  end

  def show
  end

  def new
    @quantified = current_user.quantifieds.build 
  end

  def edit
  end

  def create
    @quantified = current_user.quantifieds.build(quantified_params)
    if @quantified.save
      redirect_to quantifieds_url, notice: 'Quantified was successfully created'
    else
      @feed_items = []
      render 'pages/home'
  end
end

  def update
    if @quantified.update(quantified_params)
      redirect_to quantifieds_url, notice: 'Goal was successfully updated'
    else
      render action: 'edit'
  end
end

  def destroy
    @quantified.destroy
    redirect_to quantifieds_url
  end

  private
    def set_quantified
      @quantified = Quantified.find(params[:id])
    end

    def correct_user
      @quantified = current_user.quantifieds.find_by(id: params[:id])
      redirect_to quantifieds_path, notice: "Not authorized to edit this goal" if @quantified.nil?
    end

    def quantified_params
      params.require(:quantified).permit(:categories, :metric, :date, :comment, :private_submit, :tag_list, results_attributes: [:id, :result_value, :date_value, :good, :_destroy])
    end
end
&#13;
&#13;
&#13;

结果模型

&#13;
&#13;
class Result < ActiveRecord::Base
	belongs_to :user
  belongs_to :quantified
	has_many :comments, as: :commentable
  default_scope { order('date_value DESC') }
	scope :good, -> { where(good: true) }
	scope :good_count, -> { good.count }
end
&#13;
&#13;
&#13;

感谢您的时间和专业知识。

1 个答案:

答案 0 :(得分:2)

您可以这样做:

<% averaged.results.each do |result| %>
  <div class="<%= result.good? ? 'green' : 'red' %>">

在Rails中,ActiveRecord会自动为每个布尔字段定义一个方法,该方法始终返回truefalse(从不nil):

# example
# User's boolean attribute 'is_admin' in the DB
# Rails will define an instance method called `is_admin?`:
User.new(is_admin: true).is_admin? # => true
User.new(is_admin: false).is_admin? # => false
User.new(is_admin: nil).is_admin? # => false
# the defined method's name is `<boolean_attribute_name>?`

此外,您不需要像这样明确:

if result.good == true
  #etc.
end

你可以写:

if result.good
  #etc.
end

如果result.good返回falsenil,则不会进入if块。如果它返回除falsenil以外的任何内容,它将执行if块。