rails:定义一个新方法,同时在同一个控制器中调用另一个方法

时间:2016-09-27 21:51:47

标签: ruby-on-rails

我这里有一个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.

1 个答案:

答案 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}}虽然如果找不到组记录,此版本将引发异常。