RailsFun.tw 新手教學 day2.5 HD 的相關問題


#1

第一次發問,請大家幫忙。

本來我有設定:
resources :orders do
resources:items
end
可以正確地跑出來。orders/2/item/2/edit,EDIT之後會跑回去orders/2/item/2

我按照RailsFun.tw 新手教學 day2.5 HD在做設定。
可是後來改成VIDEO裡面教的後台:
namespace :dashboard do
resources :orders do
resources :items
end
end

JC大說,edit裡面的form_for後面要接URL,也照做了,
<%= simple_form_for @items url: dashboard_order_item_path, method: :PATCH do |f| %>

也在orders_controller的def update設定好
redirect_to dashboard_order_item_path(@order)
跑完dashboard/orders/2/items/2/edit之後,
他應該跑回去dashboard/orders/2/items/2
可是他還是跑回去orders/2/item/2

沒有回到dashboard…是哪裡設錯了嗎?


#2

貼貼看完整程式碼出來看吧 controller route view
ps: 這邊可以用markdown貼


#3

我建議…先把 route 打對,才餵進某個東西裡面,否則你連餵什麼都不知道,類似

<%= dashboard_order_item_path %>

會回傳一個網址,事實上這類的東西很簡單,輸出就是字串而已,你自己打字串進去也是一樣的東西,再來,你的東西是巢狀多重對象,而你沒餵多個對象,網址會組對有鬼,類似如果你打了 rake routes,看到這樣的東西

dashboard_order_item GET /dashboard/orders/:order_id/items/:id(.:format)
                   PATCH /dashboard/orders/:order_id/items/:id(.:format)  dashboard/items#update

可以打成以下,直接印出來看

<%=  dashboard_order_item_path(:order_id => @order.id , :id => @item.id) %>

發覺 ok 組對了,才餵到 form_for / form_tag 的 tag 去
所以你的 code 的開頭會是

<%= simple_form_for(@item , {:url => dashboard_order_item_path(:order_id => @order.id , :id => @item.id) , :method => :patch}) do |f| %>

anyway"網址"這回事一直都是獨立的,而你進去的應該是 @item 而非覆數的 @items (會變成後面的 f 包裝),所以你的 @item 來源應該是 find 才是,而新手不要用太多縮寫(省略 (){} ),把包裝先打對會動再說,以上


#4

感謝~我後來輸入兩個:id之後就成功了~


#5

自己整理一下day2.5相關問題,跟解法:

manager成功登入後的頁面,跟,manager成功登入後的頁面,應該是不一樣的。

可以參考這邊的解釋:https://github.com/plataformatec/devise/wiki/How-To%3A-Redirect-to-a-specific-page-on-successful-sign-in-and-sign-out

可以寫成:

>  def after_sign_in_path_for(resource) 
>      case resource 
>      when Manager 
>          manager_path 
>      when User 
>          user_path  
>      else
>         root_path 
>     end
> end

#6

JC大,

因為我在看VIDEO做筆記,
發現你在 2:27:00的時候,
說session[:cart][key]要變成string,可是你打字出來的是session[:cart][key].to_i

然後接下來測試之後,你說{“1”=>1,…}
這邊的"1"是string,然後又要把他to_s

後來的解法變成
> key = item.id.to_s
> session[:cart][key] ||=0
> session[:cart][key] += 1

"1"應該是integer,要把它變成.to_s(變成string)吧?


#7

我的 key 應該都是 string,value 應該都是 integer

原因大概是 Ruby 的 Hash 的 key 其實建議不要有 symbol 和 string 之外的東西,不然很容易造成混淆,別人接受後處理會很麻煩,而 value 就基本上隨便你了,而 demo 內 key 為 id,value 為 count,就這樣而已

早期版本的 session 只能用 string key + string value,後來 Rails 3 , 4 後用 Marshal.dump 來做,才能存全部的東西就是(key 和 value 隨便你塞,反正會 Marshal.load 回來),不過這邊其實很 open,你選擇你想要的作法就好,沒有所謂的正解就是

so~~ 做出你自己的版本唄,我教的也不一定是你的案例的最佳解