【问题标题】:Doesn't redirect_to page on error错误时不重定向到页面
【发布时间】:2014-01-10 15:48:10
【问题描述】:

成功后,表单远程提交并正确加载 index.js.erb(生活很好)

但是在错误(其他)时没有任何反应。我想要做的是,在出错时加载不同的文件或向 index.js.erb 添加逻辑。但是,它只是失败并且无法加载。

错误 加载资源失败:服务器响应状态为 500(内部服务器错误)我知道在实施救援后收到 406 错误

我知道这是因为它没有找到事件,但我如何确保它加载我的 index.js.erb- 所以我可以依次显示通知用户的模式

事件控制器

def index
  respond_to do |format|
    if @event = Event.find_by_event_code(params[:checkin])
      format.html { redirect_to @event, success: "You have found your event" }
      format.js
    elsif @event = Event.find_by_speaker_code(params[:checkin])
      format.html { redirect_to @event, success: "Welcome Super User. You have found your event" }
      format.js
    else
      format.html { redirect_to @event, error: "No event by that event code" }
      format.js
    end
  end
end

index.js.erb

$("#checkin-popup").remove();
$("#checkin-confirm-popup").html("<%= escape_javascript(render("/events/index.html.erb")) %>")
$('#checkin-confirm-popup').modal('show');

button.html

<%= simple_form_for @event, remote: true ,:method => 'get' do |e| %>
    <div class="talknumber"><%= text_field_tag :checkin, params[:search] %></div>
  <%= e.button :submit, "Checkin", :class => "btn btn-default" %>
<% end %>

服务器日志

Started GET "/events?utf8=%E2%9C%93&checkin=1212122&commit=Checkin" for 127.0.0.1 at 2014-01-10 11:43:39 -0500
Processing by EventsController#index as JS
  Parameters: {"utf8"=>"✓", "checkin"=>"1212122", "commit"=>"Checkin"}
   (0.5ms)  SELECT "users"."name" FROM "users"
  Event Load (0.5ms)  SELECT "events".* FROM "events" WHERE "events"."event_code" = 1212122 ORDER BY events.created_at ASC LIMIT 1
  Event Load (0.4ms)  SELECT "events".* FROM "events" WHERE "events"."speaker_code" = 1212122 ORDER BY events.created_at ASC LIMIT 1
Completed 406 Not Acceptable in 7ms (ActiveRecord: 1.4ms)

【问题讨论】:

    标签: javascript jquery ruby-on-rails redirect


    【解决方案1】:

    尝试开始救援块

      def index
        respond_to do |format|
          begin
            if @event = Event.find_by_event_code(params[:checkin])
              format.html { redirect_to @event, success: "You have found your event" }
              format.js
            elsif @event = Event.find_by_speaker_code(params[:checkin])
              format.html { redirect_to @event, success: "Welcome Super User. You have found your event" }
              format.js
            end
          rescue
            format.html { redirect_to @event, error: "No event by that event code" }
            format.js
          end
        end
      end
    

    【讨论】:

    • 嘿,我刚刚尝试了开始救援块。我现在收到 406 错误 - GET localhost:3000/… 406(不可接受)
    • @RedRory 你熟悉调试器吗?你能停止救援块中的流动并检查吗?
    • 我安装了调试器,并将其放在第 2 行,但是当我尝试“下一步”通过时。它带我进入 active_record/relation.rb 和其他高级方法,我实际上是“下一个”二十次,从来没有来过我的索引操作。
    【解决方案2】:

    如果您的视图中有引用 @event 的调用,那么您需要处理它们。如果在页面上你有(比如说)一个提交值的表单,那么只需确保视图提供了@event = Event.new 就足够了。但是,可能情况并非如此,因此如果@event 未定义,您希望通过提供在页面上下文中有意义的替代值来挽救视图阶段。类似的东西:

    <%= @event ? @event : 'No event' %>
    

    而不仅仅是

    <%= @event %>
    

    编辑:新控制器代码

    def index
     respond_to do |format|
        if @event = Event.find_by_event_code(params[:checkin])
          format.html { redirect_to @event, success: "You have found your event" }
          format.js
        else 
          if @event = Event.find_by_speaker_code(params[:checkin])
            format.html { redirect_to @event, success: "Welcome Super User. You have found your event" }
            format.js
          else
            format.html { redirect_to @event, error: "No event by that event code" }
            format.js
          end
        end
      end
    end
    

    我真的不认为这是一种很好的做事方式。表单应该是分开的,这样你就可以获得可以查询的单独参数,指定如果(比如)params.has_key? :foo 然后做某事,反之亦然。

    <%= simple_form_for @event, remote: true ,:method => 'get' do |e| %>
      <div class="talknumber">
        <%= text_field_tag :event_code, params[:search] %>
        <%= text_field_tag :speaker_code, 'value here - I don't know what params[:search is] %>
      </div>
      <%= e.button :submit, "Checkin", :class => "btn btn-default" %>
    <% end %> 
    

    这样你可以说如果params.has_key? :event_code 是假的,那么寻找params.has_key? :speaker_code,如果失败了,执行else 分支。

    【讨论】:

    • 我想到了这个;我暂时将 index.js.erb 更改为 alert("Test");所以没有加载 发生
    • 哦,所以@event 没有在index.js.erb 的任何地方使用?请记住,您的警报只会在客户端触发,并且在此之前您的服务器会出错。
    • 出于调试目的,我从 index.js.erb 中删除了所有内容,现在只调用警报。 (只是试图让它在错误时调用文件)。没运气。如果在我的 ELSE(第 10 行)之后,我正在尝试重定向到“@event”[我们知道存在],还是跳过 format.html 并直接转到 format.js
    • 好吧,你刚才说你正在检查 index.js.erb 但只有在 html 格式块中发生了设置。 js 块没有任何用处。
    • 如果不传递变量或调用 :render,我不确定 Rails 会做什么。
    猜你喜欢
    • 2013-04-11
    • 2020-05-05
    • 1970-01-01
    • 2010-12-16
    • 2014-05-15
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多