2011-11-04 110 views
0

非常新的rails。我一直在下面的一本書,幫助了很多,但這個我想不通:Rails新動作重定向

我有一些動作(方法)控制器技術在裏面:

def patadas 
    @technique = Category.find(4).technique 
end 

def golpes 
    @technique = Category.find(3).technique 
    respond_to do |format|  
     format.html { redirect_to(patadas_path) } 
    end 
end 

的想法是有一個頁面,我可以發送不同的技術,它會呈現它們。該patadas.html.erb頁有這樣的吧:

[一些HTML]

<% if @technique then %> 
     <% @technique.each do |p| %> 
      (<%= p.order %>) <%= p.korean %> - <%= p.spanish %><br /> 
     <% end %> 
    <% else %> 
     No techniques specified to show!  
    <% end %> 

我的問題是與重定向。我希望能夠向同一頁面發送不同的方法(顯然,我必須將其重命名爲技術或patadas以外的其他方法),並使其呈現與所調用的方法相對應的技術。現在重定向被執行,但它總是顯示patadas方法。

哦,我有這樣的routes.rb中文件:我看到解釋如何做到這一點對每個操作一個視圖

match '/patadas' => 'techniques#patadas', :as => 'patadas' 
match '/golpes' => 'techniques#golpes', :as => 'golpes' 

所有的教程和書籍等,但是這是真的浪費,我想要所有這些不同的行動的一個觀點。有了上述路線,我明白,如果我建立另一個名爲'golpes.html.erb'的視圖,它會渲染它們,但我正在尋找具有不同動作的單個視圖。

謝謝。

PS 此外,是否有可能有這樣的事情:

@frontal.each { |p| puts "(#{p.order}) #{p.korean} = #{p.spanish}" } 

的視圖(html.erb)文件?它比上述開啓和關閉的標籤更加優雅。有了Ruby的美麗,使用這種語法似乎很浪費。我相信一定有,但我還沒有得到這先進而:)

編輯:鑑於我所做的所有更改(創建了一個類腳手架),我重寫問題讓事情更清楚。所以,現在這就是我:

categories_controller.rb

[ bunch of stuff ] 

def show 
    @category = Category.find(params[:id]) 
    end 

的routes.rb

resources :categories 

在演示文件,我想通過ID,以便 的/可列出所有類別categories/show.html.erb file:

I want to get category.order, category.category, category.spanish to show here 
<%= link_to 'Edit', edit_category_path(@category) %> | 
<%= link_to 'Back', categories_path %> 

請原諒我的白癡,但我無法弄清楚wha t放入這個文件來列出內容。如果我嘗試做這樣的事情:

<% @category.each do |cat| %> 
    <li><%= cat.category %> - <%= cat.spanish %></li>   
<% end %> 

我得到一個錯誤

undefined method `each' for #<Category:0x007f81c42a3fd0> 

(原來的問題已經做的路線,我錯誤地希望路線來處理不同的操作,這東西實際上是完成與展示模板,因此jimworm的答案。我編輯的清晰度的問題,因爲我改變了很多事情,但真的不記得原來的措辭,抱歉)

+0

Arrghh,這太令人沮喪了。我可以讓index.htm.erb工作,因爲當然在那裏有一個@categories實例。但顯示頁面不知道技術方​​法或控制器,所以我不能得到這個工作。我想我已經在這個一直盯着太久... – kakubei

+0

好吧,重讀你的帖子的第20次後,我想出了這個: '<%@ techniquesList.each做| TEC | %> \t <%= tec.korean%>
<% end %>' 而在類別類: 'DEF顯示 #@Category = Category.find(PARAMS [:ID]) @techniquesList = Category.find( [:ID] PARAMS)technique' 這(主要)工作 – kakubei

+0

你的模型/關係是錯誤的。一個類別是否有一種技術或多種技術?另外:請把你原來的問題退回來;否則這篇文章中沒有任何意義。 – jimworm

回答

1

歡迎Rails的方式,請詢問更多,如果你還在堅持。

重定向是重定向,沒有信息請求之間保留。看起來你想要列出每個類別的技巧?請記住,你擁有的唯一輸入是一個類別,而不是任何技術。在這種情況下,我建議使用嵌套路線。

# config/routes.rb 
# this gives you the route /categories/:category_id/techniques, among other things 
resources :categories do 
    member do 
    resources :techniques 
    end 
end 

# app/controllers/techniques_controller.rb 
# note that this is only called from inside the nested route 
# so params[:category_id] is available 
class TechniquesController < ActionController::Base 
    def index 
    @category = Category.find params[:category_id] 
    @techniques = @category.techniques 
    end 
end 

# app/views/techniques/show.html.erb 
<% @techniques.each do |technique| %> 
    <p>(<%= technique.order -%>) <%= technique.korean -%> - <%= technique.spanish -%></p> 
<% end %> 

請注意使用params[:category_id]而不是固定路由名稱。您總是可以使用friendly_id通過slug來代替整數來查找類別。

https://github.com/norman/friendly_id

編輯:同時解決您的評論一點(但不是在正確的順序):

在Rails約定,有techniquetechniques之間有很大的區別。經驗豐富的Rubyist永遠不會列出技術列表technique,因爲這只是令人困惑! Technique的一個實例必須是技術,可以這麼說,如果在該模型的每個實例中有多種技術,您可以稱其爲TechniqueListTechniqueGroup或其他。

你問什麼是有一個類別的show行動顯示技術的列表。在這種情況下,你將不需要嵌套的路線。您可以使用相同的方法來顯示特定技術的類別列表(前提是類別和技術之間有多對多的關係)。

# app/controllers/categories_controller.rb 
class CategoriesController < ActionController::Base 
    def show 
    # `includes` joins the techniques table, avoids n+1 lookups 
    @category = Category.includes(:techniques).find params[:id] 
    end 
end 

# app/views/categories/show.html.erb 
<% @category.techniques.each do |technique| %> 
    <p>(<%= technique.order -%>) <%= technique.korean -%> - <%= technique.spanish -%></p> 
<% end %> 

子分類:它們是什麼?一個模型?關於Category模型的查詢?我將在下面的代碼中將它看作查詢。

# app/models/category.rb 
class Category < ActiveRecord::Base 
    class << self # this adds class methods 
    def sub_category_query(param) 
     # this line is an example only, it depends on your query 
     where(:sub_category => param) 
    end 
    end 
end 

# app/controllers/categories_controller.rb 
class CategoriesController < ActionController::Base 
    def sub_category 
    @categories = Category.sub_category_query params[:sub_category] 
    # since it's just showing a list of categories 
    # you can probably reuse the index template here 
    render :index 
    end 
end 

# config/routes.rb 
resources :categories do 
    collection do 
    # this give you an extra route to search by sub-category 
    # rails guesses the action name, and expects a param here 
    get 'sub_category/:sub_category' 
    end 
end 
+0

感謝您的回答,我會嘗試這個,但只是爲了澄清,我想要以下路線:'/ categories /:category_id'具有該類別的技術。然後'/ techniques /:technique_id'獲得這些技術的列表。然後'/ categories'會列出所有的類別。我會錯過一個路線列出子類別...路線如何呢? – kakubei

+0

用更標準的Rails約定更新了答案。希望你找到你的方式! – jimworm

+0

爲了更好地理解這一點,我創建了一個類別的腳手架,所以現在我在類別控制器: 'def show @category = Category.find(params [:id]) end' In/categories/show .htm.erb: '<%@ category.each do | cat | %>

(<%= cat.order - %>)<%= cat.korean - %> - <(%)= cat.spanish - %>

<% end %> <%=的link_to '修改',edit_category_path(@類別)%> | <%= link_to'Back',categories_path%>' 但是我得到一個錯誤:'undefined method' each#for#' 奇怪的是,最後2行工作,但它們不顯示任何內容鏈接。 – kakubei