首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理实例变量赋值的多个条件

如何处理实例变量赋值的多个条件
EN

Stack Overflow用户
提问于 2015-01-05 16:04:46
回答 3查看 262关注 0票数 0

我的控制器中有以下内容,它们将根据Ajax调用接收到的参数分配不同的结果集合。它很混乱,我只想调用一个包含所有逻辑的函数,而不是在索引控制器中调用所有这些逻辑

代码语言:javascript
复制
class PublicController < ApplicationController
  def index
    if params[:literacy_param].present?
      @skills = Skill.search(params)
    elsif params[:numeracy_param].present?
      @skills = Skill.numeracy_default_params
    elsif params[:numeracy_number_skills].present?
      @skills = Skill.numeracy_number_skills
    elsif params[:numeracy_measuring_skills].present?
      @skills = Skill.numeracy_measuring_skills
    elsif params[:numeracy_data_skills].present?
      @skills = Skill.numeracy_data_skills
    else
      @skills = Skill.default_params
    end
  end
end

我只是有点不确定如何设置我的函数,以便它可以读取正在发送的参数,

到目前为止,我已经想出了这个

代码语言:javascript
复制
private
 def skills(params)
   if params[:literacy_param].present?
     @skills = Skill.search(params)
   elsif params[:numeracy_param].present?
     @skills = Skill.numeracy_default_params
   elsif params[:numeracy_number_skills].present?
    @skills = Skill.numeracy_number_skills
   elsif params[:numeracy_measuring_skills].present?
    @skills = Skill.numeracy_measuring_skills
   elsif params[:numeracy_data_skills].present?
    @skills = Skill.numeracy_data_skills
   else
    @skills = Skill.default_params
   end    
 end

然后,在我的索引操作中,我会这样做

代码语言:javascript
复制
@skills = skills(params)

这是一种有效的方式吗?

谢谢

EN

回答 3

Stack Overflow用户

发布于 2015-01-05 17:26:33

你可以做到的

代码语言:javascript
复制
class PublicController < ApplicationController
  def index
    skills = ['literacy_param', 'numeracy_param', 'numeracy_number_skills', 'numeracy_measuring_skills', 'numeracy_data_skills']
    common_in_params = (skills & params).first
    @skills = common_in_params.present? ? (common_in_params.eql?('literacy_param') ? Skill.search(params) : Skill.send(common_in_params)) : Skill.default_params                
  end
end

您可以在初始化器中定义skills数组以实现可重用性

票数 3
EN

Stack Overflow用户

发布于 2015-01-05 17:31:15

一种方法是这样做:

代码语言:javascript
复制
def skills(params)
  set_of_skills = params.slice(
    :numeracy_param,
    :numeracy_number_skills,
    :numeracy_measuring_skills,
    :numeracy_data_skills,
  ).first

  @skills = if params[:literacy_param]
    Skill.search(params)
  elsif set_of_skills
    Skill.public_send(set_of_skills)
  else
    Skill.default_params
  end
end

我还建议将其解压缩到lib/文件夹中,并进行单元测试。这样您就可以在控制器中执行以下操作:

代码语言:javascript
复制
def index
  @skills = SkillSearch.new(params).search
end
票数 1
EN

Stack Overflow用户

发布于 2015-01-05 17:42:41

我现在有两种方法可以考虑这样做:

  1. 将参数包装在一个唯一的键中。就像在params = { :keyword => :literacy_param }中一样,然后使用这个唯一的键来标识正确的操作。

In you skill.rb

代码语言:javascript
复制
def self.filter(params)
  if params[:keyword] == :literacy_param
    search(params)
  elsif available_filters.include?(params[:keyword])
    public_send(params[:keyword])
  else
    default_params
  end
end

private

  def self.available_filters
    %i{numeracy_default_params numeracy_number_skills numeracy_measuring_skills numeracy_data_skills}
  end

考虑到您发送的是:keyword密钥形式的:numeracy_default_params而不是:numeracy_param。否则,您将不得不在filter方法中创建另一个elsif

然后在你的index方法中:

代码语言:javascript
复制
def index
  @skilles = Skill.filter(params)
end

  1. 您可以创建一个单独的filter类,这是一个可扩展的解决方案,以防您需要进行复杂的搜索查询和过滤。

让我们将其命名为SkillSeacrher,在您的应用程序内部/models/skill_searcher.rb

代码语言:javascript
复制
class SkillSearcher
  attr_reader :keyword

  def initialize(keyword)
    @keyword = keyword
  end

  def filter
    if keyword == :literacy_param
      Skill.search(params)
    elsif available_filters.include?(keyword)
      Skill.public_send(keyword)
    else
      Skill.default_params
    end
  end

  private

    def self.available_filters
      %i{numeracy_default_params numeracy_number_skills numeracy_measuring_skills numeracy_data_skills}
    end
end

然后在index方法中:

代码语言:javascript
复制
def index
  @skills = SkillSearcher.new(params[:keyword]).filter
end

但是,您可以对filter方法再做一次更改(取决于您的喜好):

代码语言:javascript
复制
def filter
  if keyword == :literacy_param
    Skill.search(params)
  else
    Skill.public_send(available_filters.include?(keyword) ? keyword : :default_params)
  end
end

而且,如果所有这些方法都接受params作为参数,那么它将会更加流畅:

代码语言:javascript
复制
def filter
  Skill.public_send(available_filters.include?(keyword) ? keyword : :default_params, params)
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27775509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档