2017-04-26 75 views
0

我還是Ruby on Rails的新手,並且我正在一點關注。Ruby on Rails更新方法被意外調用..爲什麼?

我的數據庫包含教師和課程模型。它們與has_and_belongs_to_many關聯關聯(目前不應該更改)。

課程詳情查看:

<p> Teacher: 
    <%= form_tag url_for(controller: 'courses', action: 'add_teacher') ,method: 'put' do%> 
    <%= select_tag :teacher, options_for_select(Teacher.all.collect {|t| [t._name, t.id]})%> 
    <%= hidden_field_tag(:course, value = @course.id) %> 
    <%= submit_tag 'hinzufügen' %> 
    <%end %> 
<% end %></p> 

Course_Controller:

def add_teacher 
    @course = Course.find(params[:course]) 
    @teacher = Teacher.find(params[:teacher]) unless params[:teacher].nil? 
    @course.teachers << @teacher 
    redirect_to action: 'show' 
end 


def update 
    redirect_to action: 'add_teacher', course: params[:course], teacher: params[:teacher] 
end 

這是我的代碼的一部分。我不知道是否有路由問題或其他問題。我只是不明白爲什麼在函數add_teacher被調用之前調用函數更新。首先,我想可能rails會意識到我想更改現有的記錄,所以當更改(@ course.teachers < < @teacher)「正在發生」時會調用函數「update」。但他首先調用update函數,不管是否重定向到add_teacher,他都會調用函數!爲什麼?

現在我使用更新函數重定向到add_teacher與正確的參數。 可能有人對我有更好的解決方案或答案爲什麼自動調用函數'update'以及如何正確設置路線?

非常感謝您的幫助和對我的英語不好!

再見

更新: 好,我確信他重定向無論如何,但我評論它,現在他沒有做任何事情。

我的路線是這樣的:

get 'courses/add_teacher' 
get 'courses/update' 
resources :students, :forms, :votes, :courses, :years, :teachers 

和更多像這樣的

+0

你的路線是什麼樣子 – Iceman

+0

爲了符合REST模型,你應該有'資源:課程',裏面有'資源:教師',所以你可以把教師和課程聯繫起來。 – tadman

+0

@tadman好吧,我應該將函數映射到這樣的路線:'post'/:courses /:teachers''?我是新來的路由以及^^ – homior

回答

0

嘗試從改變你的路線......

get 'courses/add_teacher' 
get 'courses/update' 
resources :students, :forms, :votes, :courses, :years, :teachers 

到...

put 'courses/:id/add_teacher' 
resources :students, :forms, :votes, :courses, :years, :teachers 

你是usin g GET用於顯示頁面或表單。動作PUT(您在表單中使用的)是用於更新對象的動作。

你並不需要你有,因爲它已經定義的更新路由時稱爲

resources :courses 

(這是一個PUT動作)。

我的猜測是,由於您在表單中使用了PUT,因此Rails繞過了add_teacher方法,併爲需要更新的課程採取了第一個PUT操作。

您可能會考慮將您的資源嵌套到路線中。我認爲這會更容易處理。

希望這有助於! :) 你可以在這裏閱讀更多... http://guides.rubyonrails.org/routing.html#crud-verbs-and-actions