【问题标题】:Why does my rails AJAX request throw internal server error?为什么我的 rails AJAX 请求会引发内部服务器错误?
【发布时间】:2013-10-24 14:25:10
【问题描述】:

我有一张桌子,每一行都有一个链接

 <%= link_to 'Delete', [lesson.group, lesson], remote: true,method: :delete%>

我希望链接销毁相应的数据库条目并从表中删除相应的行而不重新加载页面。 动作是

def destroy
        @lesson = @group.lessons.find(params[:id])

        @lesson.destroy

        respond_to do |format|
            if @lesson
                format.html { redirect_to edit_group_path(@group), notice:'Succesfully deleted lesson' }
                format.js {}
            else
                format.html { redirect_to edit_group_path(@group), notice:'Error!' }
            end
        end
    end

条目被删除,但我只能在重新加载页面时看到更改,并且控制台抛出

DELETE http://localhost:3000/groups/1/lessons/14 500 (Internal Server Error) 

从日志中提取:

Started DELETE "/groups/1/lessons/18" for 127.0.0.1 at 2013-10-24 18:39:22 +0400
Processing by LessonsController#destroy as JS
  Parameters: {"group_id"=>"1", "id"=>"18"}
  [1m[36mGroup Load (1.0ms)[0m  [1mSELECT "groups".* FROM "groups" WHERE "groups"."id" = ? LIMIT 1[0m  [["id", "1"]]
  [1m[35mLesson Load (1.0ms)[0m  SELECT "lessons".* FROM "lessons" WHERE "lessons"."group_id" = 1 AND "lessons"."id" = ? LIMIT 1  [["id", "18"]]
  [1m[36m (0.0ms)[0m  [1mbegin transaction[0m
  [1m[35mSQL (4.0ms)[0m  DELETE FROM "lessons" WHERE "lessons"."id" = ?  [["id", 18]]
  [1m[36m (10.0ms)[0m  [1mcommit transaction[0m
Completed 500 Internal Server Error in 35ms

ActionView::MissingTemplate (Missing template lessons/destroy, application/destroy with {:locale=>[:en], :formats=>[:js, :html], :handlers=>[:erb, :builder, :coffee]}. Searched in:
  * "C:/Sites/timetable/app/views"
)

【问题讨论】:

  • 您的服务器控制台中是否还有其他错误?
  • @dax,不,什么都没有。其他 ajax 请求(例如创建新条目时)也具有相同的效果。
  • 我没有看到 @group 被定义。
  • @DamienRoche,这里没有显示,但是显示了。
  • 如果你也粘贴回溯就好了

标签: javascript ruby-on-rails ajax forms


【解决方案1】:

因为您没有处理销毁该对象后应该发生的事情。

respond_to do |format|
        if @lesson
            format.html { redirect_to edit_group_path(@group), notice:'Succesfully deleted lesson' }
            format.js {}
          # ...

这里的format.js {} 说“用destroy.js.erbdestroy.html.erb 或类似的方式响应JS”,这是你没有设置的,根据你的错误(ActionView::MissingTemplate (Missing template application/destroy with {:locale=&gt;[:en], :formats=&gt;[:js, :html], :handlers=&gt;[:erb, :builder, :coffee]})。

您要么需要设置该模板,要么在定义模板的地方呈现另一个动作(例如render action:)。或者你可以做一个重定向(我不确定一个简单的 redirect_to 是否在这里工作)。但是请求需要以某种方式“结束”,通过渲染或重定向。

【讨论】:

  • 这实际上使用了一个简单的redirect_to。不确定它是否会在未来中断,但目前看来还不错。
猜你喜欢
  • 2018-05-07
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多