2013-07-15 61 views
0

我對rails非常陌生,所以請原諒我是否問了這樣一個基本問題。Rails 3 - 使用submit_tag調用控制器方法

我有這個形式我html.erb頁:

<%= form_tag(posts_path(:controller => "posts", :action => "create_thread"), :method => "post") do%> 
    Title: 
    <br></br> 
    <%= text_area_tag 'title', 'Thread\'s title is required!', :rows => 1, :cols => 30 %> 
    <br></br> 
    Message: 
    <br></br> 
    <%= text_area_tag 'body', nil, :rows => 15, :cols => 50 %> 
    <br></br> 
    <%= submit_tag "Create Thread" %> 
<% end %> 

我定義在控制器中的 「create_thread」 的方法:

class PostsController < ApplicationController 
    def create_thread 
     logger.info("Thread created: ") 
    end 
end 

在routes.rb中的文件,我創建了一個提交路線:

resources :posts do 
collection do 
    post 'index', :as => :create_thread 
end 

基本上,當我點擊窗體上的「創建線程」按鈕時,我想要r ails在PostsController類中執行函數「create_thread」,然後加載「index」頁面。但是,當我點擊「創建線程」按鈕時,它直接進入了「索引」頁面(所以路徑至少工作),但它並沒有執行「create_thread」函數。控制器。

這正是它顯示在控制檯上,當我在按鈕上點擊:

Started POST "/posts?action=create_thread" for 127.0.0.1 at 2013-07-14 22:08:35 -0700 
Processing by PostsController#index as HTML 
Parameters: {"utf8"=>"✓", "authenticity_token"=>"9XVUrStaysmdOc6ug/A3XXX/8bzLkY8ixCkiAfHs9fU=", "title"=>"Thread's title is required!", "body"=>"", "commit"=>"Create Thread"} 

這裏是耙路線的輸出

   root  /         posts#index 
    new_thread_posts GET /posts/new_thread(.:format)   posts#new_thread 
create_thread_posts POST /posts(.:format)     posts#index 
current_thread_post GET /posts/:id/current_thread(.:format) posts#current_thread 
       posts GET /posts(.:format)     posts#index 
        POST /posts(.:format)     posts#create 
      new_post GET /posts/new(.:format)    posts#new 
      edit_post GET /posts/:id/edit(.:format)   posts#edit 
       post GET /posts/:id(.:format)    posts#show 
        PUT /posts/:id(.:format)    posts#update 
        DELETE /posts/:id(.:format)    posts#destroy 

所以,我怎麼軌道執行「 PostsController中的create_thread函數?過去兩天我一直在網上搜索,嘗試各種各樣的東西,但都沒有爲我工作。

任何提示或指針將不勝感激!

非常感謝您的幫助。

+0

添加的輸出「耙路線」 –

+0

你嘗試登錄後使用您的create_thread行動中redirect_to的? –

+0

@ prasad.surase我用耙子路線的輸出更新了帖子。謝謝 – TATN

回答

0

請嘗試以下

resources :posts do 
    post :create_thread, on: :collection 
end 

form_tag(controller: :posts, action: :create_thread) 
+0

謝謝。這幾乎可行!它給了我在routes.rb中的錯誤「無法在資源範圍外使用集合」。錯誤來自「post:create_thread,on :: collection」。如果我註釋掉了「on:collection」部分,那麼它會執行create_thread方法。但現在,它說「缺少模板帖子/ create_thread」。我不想創建另一個「create_thread.html.erb」頁面。我希望它回到索引頁面,所以在路由中,我嘗試了「post:create_thread,'index'」,但這似乎不起作用(該函數已執行,但出現錯誤「缺少模板帖子/ create_thread「 – TATN

+0

Bingo!如果我在create_thread方法內部加入了」redirect_to posts_path「(除了像你所建議的那樣修改routes.rb和form_tag()),那麼它就起作用了!create_thread方法被執行了,rails拿走了我然後回到索引頁,但是我只是想知道是否在route.rb中做了,而不是在create_thread方法中。 – TATN

+0

你應該可以在你的路由中使用'collection',請在這裏閱讀http: //guides.rubyonrails.org/routing.html#adding-more-restful-actions –