2016-09-27 51 views
0

我在這裏有一個rails項目。在控制器中,我有一個方法定義爲 single_output,如果url類似於/single_output/1,它會給我person_id=1的信息,然後我想在同一個控制器中添加另一個方法group_output,但需要調用single_output。基本上我想要它做的是如果url是像/group_output/1,它會給我的group_id=1其中包括person_id和這些person_id將給我所有的信息。rails:定義一個新方法,同時調用另一個方法在同一個控制器中

我的解決辦法是這樣的:

控制器:

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

常規的方式來做到這一點是使用另一種方法。

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 

但你的代碼是不同尋常的...我希望在group_outputperson_idsGroup對象的數組。一個組對象has_many人?你需要一個數組還是第一個匹配的組對象?在這種情況下,你只需要做的......

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就被稱爲idrecord_id所以在一個標準的Rails應用程序我希望它是@group = Group.find_by(id: params[:group_id])甚至@group = Group.find(params[:group_id])儘管如果羣創是該版本將引發異常未找到。

相關問題