【问题标题】:Why using format.html {redirect_to @user} does not redirect to the page I want为什么使用 format.html {redirect_to @user} 不会重定向到我想要的页面
【发布时间】:2014-03-23 07:34:53
【问题描述】:

在 Rails 中使用 jquery ajax 时,我想在 ajax 请求后重定向到 /users/:id(即 users#show),但我失败了。以下是相关代码:

app/views/users/new_skills.html.erb

<%= form_for(@user, url: "create_skills", html: { id: "create_skills_form" }) do |f| %>
  .....
  <%= f.submit "Save", class: "btn btn-primary" %>
<% end %>

app/assets/javascript/users.js

jQuery.fn.submitWithAjax = function() {
  $(this).submit(function(event) {
    ......
    var url = $(this).attr("action");
    $.post(url, {skills: skill_array}, null, "script");
    return false;
  });
}

$(document).ready(function() {
  $("#create_skills_form").submitWithAjax();
});

app/controllers/users_controller.rb

  def create_skills
    @user = User.find(params[:id])
    ......

    flash[:notice] = "Thank you! You have successfully add new skills!"
    respond_to do |format|
      format.html { redirect_to @user }
      format.js
    end
  end

users_controller返回后,服务器的日志如下:

Started POST "/users/1/create_skills" for 127.0.0.1 at 2014-03-23 15:26:24 +0800
Processing by UsersController#create_skills as JS
  Parameters: {"skills"=>["skill_1__Primary"], "id"=>"1"}
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", "1"]]
  Skill Load (0.2ms)  SELECT "skills".* FROM "skills" INNER JOIN "abilities" ON "skills"."id" = "abilities"."skill_id" WHERE "abilities"."user_id" = ?  [["user_id", 1]]
  Rendered users/create_skills.js.erb (0.0ms)
Completed 200 OK in 6ms (Views: 1.9ms | ActiveRecord: 0.4ms)

我想要的只是在ajax请求之后重定向到user/:id页面,这是到users#show的路由,就像我在users_controller.rb中写的一样:

        respond_to do |format|
          format.html { redirect_to @user }
          format.js
        end

但是在ajax请求之后,页面什么都不做,只是保持请求之前的样子。

谁能告诉我为什么?我的代码有问题吗?

请帮助我,我只是 RoR 的新手,可能会有一些愚蠢的错误。

提前致谢!

【问题讨论】:

  • 我认为您应该将 remote:true 添加到表单中?

标签: jquery ruby-on-rails ajax


【解决方案1】:

AFAIK,这与网络浏览器如何处理响应有关。由于请求是使用 Ajax 发出的,因此它不会遵循与由超链接发起的相同的过程。

解决方案,在你的 Ajax 中,处理成功的响应并添加:

window.location.href = "redirect location"

【讨论】:

    【解决方案2】:

    在您的控制台中查看这一行:

    UsersController#create_skills 作为 JS 处理

    这意味着请求由您的 response_to 块中的 format.js 块处理,您没有重定向。实际上,即使你把它也放在那里,重定向也不起作用。

    请参阅以下关于如何在 ajax 调用中重定向的答案: Rails 3: How to "redirect_to" in Ajax call? (和veritas1回复的差不多)

    顺便说一句,您似乎还有一个 create_skills.js.erb 文件。你也可以把重定向放在那里:

    window.location.href = "<%= user_path(@user) %>"
    

    【讨论】:

    • 谢谢你,这对我有用。但是目前我只是在控制器中编写 js 代码:format.js { render js: "window.location.href='#{user_path(@user)}'" }。但我仍然不知道如何在 create_skills.js.erb 文件中动态设置 window.location.href。你有什么想法吗?
    • 我回复的最后一段基本上告诉你如何从create_skils.js.erb重定向你只需要复制粘贴它。我编辑了我的答案以更好地满足您的需求。
    猜你喜欢
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 2023-04-03
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 2021-02-17
    相关资源
    最近更新 更多