我这里有一个rails项目。在控制器中,我定义了一个方法
single_output
,如果网址与/single_output/1
类似,则会向我提供person_id=1
的信息,然后我想在同一控制器中添加另一种方法group_output
,但是需要致电single_output
。基本上我想要的是,如果网址与/group_output/1
类似,它会向我提供group_id=1
的信息,其中包含一些person_id
,这些person_id
会告诉我他们所有的信息。
我的解决方案是:
控制器:
def single_output
person_id = param[:person.id]
result = Person.where(:person_id => person_id)
end
def group_output
group_id = params[:group_id]
person_ids = Group.where(:group_id => group_id)
person_ids.each do |person_id|
output = get '/single_output/' + person_id
end
end
路线:
match "School/single_output/:person_id(.:format)" => "School#single_output"
match "School/group_output/:group_id(.:format)" => "School#group_output"
但似乎get
方法不是一种很好的方法。
或者我想出了另一个想法:
redirect_to '/single_output/' + person_id
但它显示Render and/or redirect were called multiple times in this action.
答案 0 :(得分:1)
执行此操作的常规方法是使用其他方法。
def single_output
get_person(params[:person_id])
end
def group_output
group_id = params[:group_id]
person_ids = Group.where(:group_id => group_id)
person_ids.each do |person_id|
output = get_person(person_id)
end
end
private
def get_person(id)
Person.where(person_id: id)
end
但是你的代码很不寻常......我希望person_ids
中的group_output
成为Group
个对象的数组。群组对象是has_many
人吗?你需要一个数组或只需要第一个匹配的Group对象吗?在这种情况下,您只需要做...
def single_output
get_person(params[:person_id])
end
def group_output
@group = Group.find_by(group_id: params[:group_id])
end
private
def get_person(id)
Person.find_by(person_id: id)
end
在输出视图中,您只需遍历@group.people
,这将是属于该组的所有人。
最后,rails约定是一个记录ID只被称为id
而不是record_id
所以在标准的rails应用程序中,我希望它是@group = Group.find_by(id: params[:group_id])
甚至是@group = Group.find(params[:group_id])
{{1}}虽然如果找不到组记录,此版本将引发异常。