我的控制器中有以下内容,它们将根据Ajax调用接收到的参数分配不同的结果集合。它很混乱,我只想调用一个包含所有逻辑的函数,而不是在索引控制器中调用所有这些逻辑
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我只是有点不确定如何设置我的函数,以便它可以读取正在发送的参数,
到目前为止,我已经想出了这个
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然后,在我的索引操作中,我会这样做
@skills = skills(params)这是一种有效的方式吗?
谢谢
发布于 2015-01-05 17:26:33
你可以做到的
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数组以实现可重用性
发布于 2015-01-05 17:31:15
一种方法是这样做:
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/文件夹中,并进行单元测试。这样您就可以在控制器中执行以下操作:
def index
@skills = SkillSearch.new(params).search
end发布于 2015-01-05 17:42:41
我现在有两种方法可以考虑这样做:
params = { :keyword => :literacy_param }中一样,然后使用这个唯一的键来标识正确的操作。In you skill.rb
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方法中:
def index
@skilles = Skill.filter(params)
end让我们将其命名为SkillSeacrher,在您的应用程序内部/models/skill_searcher.rb
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方法中:
def index
@skills = SkillSearcher.new(params[:keyword]).filter
end但是,您可以对filter方法再做一次更改(取决于您的喜好):
def filter
if keyword == :literacy_param
Skill.search(params)
else
Skill.public_send(available_filters.include?(keyword) ? keyword : :default_params)
end
end而且,如果所有这些方法都接受params作为参数,那么它将会更加流畅:
def filter
Skill.public_send(available_filters.include?(keyword) ? keyword : :default_params, params)
endhttps://stackoverflow.com/questions/27775509
复制相似问题