我还是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认识到我想改变现有的记录,所以功能&#34;更新&#34;当改变(@ course.teachers&lt;&lt;&lt; @teacher)&#34;正在发生时被调用&#34; 。但他首先调用更新功能,如果我重定向到add_teacher并不重要,他会调用该函数!为什么呢?
现在我使用更新功能将add_teacher重定向到正确的参数。 可能有人为我提供了更好的解决方案,或者为什么功能更新&#39;是自动调用以及如何正确设置路径?
非常感谢你的帮助,并为我糟糕的英语感到抱歉!
再见
更新 好的,我确信无论如何他都会重定向,但我对它进行了评论,现在他还没有做任何事情。
我的路线看起来像这样:
get 'courses/add_teacher'
get 'courses/update'
resources :students, :forms, :votes, :courses, :years, :teachers
以及更多像这样的
答案 0 :(得分: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
您使用的是用于显示页面或表单的GET。动作PUT(您在表单中使用的动作)是用于更新对象的动作。
您不需要更新路线,因为您在拨打电话时已经定义了
resources :courses
(这是PUT行动)。
我的猜测是,由于您在表单中使用了PUT,Rails绕过了add_teacher方法,并对将要更新的课程采取了第一个PUT操作。
您可以考虑在路线中嵌套资源。我认为这样会更容易使用。
希望这有帮助! :) 你可以在这里阅读更多... http://guides.rubyonrails.org/routing.html#crud-verbs-and-actions