【问题标题】:Ruby on Rails update method is accidentally called.. why?Ruby on Rails 更新方法被意外调用.. 为什么?
【发布时间】:2017-04-26 19:19:00
【问题描述】:

我对 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

现在我正在使用更新功能重定向到具有正确参数的 add_teacher。 有人可以为我提供更好的解决方案或回答为什么自动调用“更新”功能以及如何正确设置路线?

非常感谢您的帮助,抱歉我的英语不好!

再见

更新: 好的,我确定他无论如何都会重定向,但我评论了它,现在他什么也没做。

我的路线如下所示:

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

还有很多这样的

【问题讨论】:

  • 你的路线是什么样子的
  • 要符合 REST 模型,您应该拥有 resources :courses 和其中的 resources :teachers,这样您就可以将教师与课程关联起来。
  • @tadman 好的,我是否应该将函数映射到这样的路由:post '/:courses/:teachers'?我也是路由新手^^
  • 尽可能让resources 为您完成工作。 official Routing guide 有很多例子可供参考。避免使用手工编码的getpost 路由,除非没有其他方法可以获得您想要的结果。如果/courses/:course_id/teachers 是可接受的 URL,则没有理由覆盖。

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


【解决方案1】:

尝试从...更改您的路线

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 2011-02-17
    • 1970-01-01
    相关资源
    最近更新 更多