多層view


#1

關於我的routes.rb

get '/yooos' => 'yooos#index'

但是我現在想要回傳 views/booos/index.html.erb or views/booos/toooos/index.html.erb

yooos controller的部分有辦法寫嗎?

 def index
   redirect_to ??????
 end

#2

我不確定你要 301 redirect_to 還是直接類似 render action 的手法完成
redirect_to 後面可以接 path,也就是 route path,請看你的 rake routes,類似

redirect_to root_path

不會用path的話請見這邊,大概就是rake routes後看一下左邊的perfix然後加上_path即可

而跨 controller 去取 action 的 view 來用的話…這邊並不常用(因為你的流程通常有問題),然而記得使用前一定要把 view 要用的變數在這個 action 內也要準備好,類似使用

render template: ‘controller/action’

所以你有 A or B path 的 view 時,可以先判斷要 B 後才使用上面語法,判斷不過的話就使用 A 原來的 view 之類的

至於簡單解的話,直接丟到 view 內用 partial 解唄,把兩邊共通的 content 抽出來,而 partial 可以輕易的跨資料夾存取的,這樣會正規些就是了


#3

我在statics/index.html
試了render :template 'products/index'
然後在statics_controller中的index action裡加了@products=Product.all 這是可行的

但如果想試render :partial 'products/index' 這樣看來是一定要把index改成_index.html.erb
我看也不少人用<%=render :partial 'products/_index, local: @products%> 但這樣應該會有問題

有比較好的解法嗎,不想改成_index
還是在statics資料夾中再開一個與_index檔案內容相同的就好??


#4

在不同的 action 內要讀到相同的 html.erb ,是在 controller 的 action 內用

render :action => 'action_name'

而如果你是要 sub html 的話( html.erb 的套疊)則是在 html.erb 內寫你所說的

<%= render :partial 'products/_index, local: {products: @products} %>

這樣才對,而裡面用 products 變數而非 @products,如果你要用 @products,就可以不用寫在 local 內(@系列變數都會從 controller 開始穿透到每個 html.erb 內,而 locals 是將其變成區域變數)

再來,不管你用哪一種,類似 render :actionrender :partial,則你必須要把下個階段的變數整理出來才行,類似

@products = Product.all

否則下一段的 code 要取用 @products 會是 nil 則非常正常才是,以上