Ruby on Rails更新方法被意外调用..为什么?

时间:2017-04-26 19:19:01

标签: ruby-on-rails ruby-on-rails-3 has-and-belongs-to-many

我还是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

以及更多像这样的

1 个答案:

答案 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