想請問送出From時的路由設定


#1

小弟最近練了許多次,也會刻出基本的CRUD,但都僅限於只使用一個controller
小弟目前的構想是想將權限分隔開來,分別是posts, sysop
create的部分已經寫好,但是不解為甚麼按下送出表單時它抓的路由會是posts而不是認sysop#new

Rails.application.routes.draw do
	root "posts#index" #Default Page

	resources :sysop
	resources :posts, :only => :index

end

上面這是我目前路由的做法,看了我自己許多的MVC三種程式碼還是找不到關聯性…想下關鍵字爬文也不知道怎麼爬,可以指點迷津小弟嗎QQ謝謝


#2

你打 rake routes 可以看到常見的幾個動作對應的 HTTP VERB
create 是對應 POST 沒錯
new 是進入頁面時獲得頁面資訊時的 request。
然後多了解一下 HTTP VERB 的意涵吧
送表單的時候想要用 GET 還滿不恰當的

$ rake routes

 	       Prefix Verb   URI Pattern                  Controller#Action
           events GET    /events(.:format)            events#index
                  POST   /events(.:format)            events#create
        new_event GET    /events/new(.:format)        events#new
       edit_event GET    /events/:id/edit(.:format)   events#edit
            event GET    /events/:id(.:format)        events#show
                  PATCH  /events/:id(.:format)        events#update
                  PUT    /events/:id(.:format)        events#update
                  DELETE /events/:id(.:format)        events#destroy
          welcome GET    /welcome(.:format)           welcome#index
welcome_say_hello GET    /welcome/say_hello(.:format) welcome#say
             root GET    /                            welcome#index

#3

哈囉,可能我語意有誤,是按表單送出他會去抓posts#new 去post
而不是用sysop#new 去post

class SysopController < ApplicationController
def index
@post = Post.all
end

def new
@post = Post.new
end

def create
@post = Post.new(post_params)

if @post[:title].empty?
redirect_to root_path, notice: "The Title can’t be Empty."
elsif @post.save
redirect_to root_path, notice: "Create Article Success."
else
render :new
end
end

private
def post_params
params.require(:post).permit(:title, :content)
end

end


#4

好好的看你產出的 HTML 如何?而非 Rails 的 code …


#5

看你 form 的 action 欄位就知 create 的目的地了
ps: posts#new 是一個新增的畫面,而不是送出的動作


#6

感謝兩位指點,已經成功了,但我還是不太解預設為甚麼會是送posts_create才對…
我參考 https://apidock.com/rails/ActionView/Helpers/FormHelper/form_for 去做改寫

<%= form_for (@post) do |f| %>
<%=f.label :title, “Title” %>
<%=f.text_field :title %>

<%=f.label :content, “Content” %>
<%=f.text_field :content %>

<%= f.submit %>
<% end %>

我把第一行改成<%= form_for @post, as: :post, url: sysop_index_path do |f| %> 強迫指定就可以
只是這種方式去寫應該不是最佳解吧? 因為這樣做的話edit的話就找不到路由QQ


#7

如果官方的 helper 都不是最佳解的話,對我而言的最佳解應該是寫 HTML 唄,然而事實上我也常常這樣做

and 請把事物的本質看透唄,我解釋給你聽好了

當你把東西餵給 form_for 以前版本的作法是和你說的『並非最佳解』一樣,一定要餵 url 進去的,但是後期偷懶,你可以只餵 @post 對應到的是 @post.class => controller name,所以你其餘什麼都不給,就一定是 PostsController

Rails 一直都是約定大於設定,然後你問我說你不要約定,然後又沒有設定,哪裡來的心電感應觀落陰可以讓你導到 SysopController 去?

Youtube 上面搜尋討論區名稱,就可以找到一票新手教學,你可以從那邊開始,別在那邊亂猜亂想,一切有跡可循,不然你會浪費太多時間在 … 一票看似非常 magic 的東西上面,但無法看透本質之類的


#8

因為你送的物件是 @post,改成 @sysop 就會改路徑了。


#9

他只有一個 model 想分兩個 controller 唄,這東西和變數名稱無關


#10

Steven 我這樣改過了,只是還是會噴error

JC大 … 我以為模組化才是最佳的方式,沒想到寫html才是好解法QQ,只是這樣就變成好像create.update.delete都需要各寫一個嗎


#11

見過地獄你什麼都不用怕,但你一直在天堂永遠不會知道人間疾苦不是?


#12

hi, 說一下 sysop 用來作什麼用的?
為什麼要兩個 controller 共用一個 model?
因為通常語意上 controller 會跟 model 有關
而 form_for 會自動識別 model 的類型而不是名稱


#13

我的想法是想要將controller分開,不想把功能寫在同一個controller ,後台的歸後台,前台歸前台
不知道這樣是不是規劃錯了?


#14

跟我之前碰到的問題一樣~

終於也可以來回復一下:blush:

幾個階段

新手期

將controller分開 可以用devise + role +cancancan

強制去區分

就是當你判斷出每個人身份 是管理員 他會多那些選項出來 或是用哪一個 controller

當他是一般使用者 他會有那些選項不顯示出來

devise + role +cancancan 可以達成

作為學習 這個組合超級強大 好用到靠杯

可是當你把它拿來做成商業化的東西 這個架構會搞到你最後超級亂 因為一個頁面裡面會超級多判斷

你會看到昏頭

接下來就準備做routes分層 前台+後台 完全切割 不過這是比較後話

你可以先去玩看看 devise + role +cancancan 然後按角色去區隔+判斷

好了再來回來問喔~


然後 form_for 的相關參數 可以來這裡看
(要習慣關鍵字找尋語法用途 英文不懂就算了 他使用的做法 跟結果總是看得懂吧)

https://apidock.com/rails/ActionView/Helpers/FormHelper/form_for

簡單講 controller 都用預設的讀取方法 你的東西是從post來使用 如果沒有其他特別需求
系統預設就是執行 Post這一個動作 但有特殊的需要 就記得要告訴他 你要幹嘛

:grin:


#15

瞭解了謝謝,我也是打算用devise,我再慢慢研究一下Q_Q


#16

Agile Web Development with Rails 4
Rails in Depth --> Action View --> Processing Forms
17%20PM