0

我正在尝试让 AJAX 在我的 rails 应用程序中的表单上工作,并且大约完成了 75% 的工作。我有一个表格,一个人可以创建一个活动并用技能标记该活动。我想为他们提供在表单中创建新技能的能力。我可以用表格替换“创建新技能”链接,然后毫无问题地保存记录。我的问题是保存记录后,rails 不断将我重定向回我的主页,而不是返回到带有表单的页面。如果用户通过典型的 HTML 表单创建技能,则重定向是正常行为。

我的页面上的链接,用于创建变成表格的新技能:

<%= link_to "Create A New Skill", new_skill_path, :id => "new-skill-link", remote: true %>

替换链接的新技能形态:

<%= form_for Skill.new, :remote => true do |f| %>
  <%= f.text_field :description %>
  <%= f.submit "Save", :class => 'btn-large btn-primary' %>
<% end %>

我的技能控制器(新建和创建方法):

def new
  @skill = Skill.new
  @tags = current_user.tags

  respond_to do |format|
    format.html
    format.js
  end
end

def create
  @skill = current_user.skills.new(params[:skill])
  params[:skill][:tag_ids] ||= []

  respond_to do |format|
    if @skill.save
      flash[:success] = "Skill was successfully created!"
      format.html { redirect_to home_page_url }
      format.js { render action: "create" }
    else 
      flash.now[:error] = "There was an error saving your skill."
      format.html { render action: "new" }
      format.js { render action: "new" }
    end
  end
end

我的 new.js.erb:

$("#new-skill-link").hide().after('<%= j render("skills/remote_form") %>');

我的 create.js.erb:

$("#new-skill").remove();
$("#new-skill-link").show();
$(".skill-list ul").append('<%= j render(@skill) %>');

Rails 似乎将请求解释为 HTML,因此它使用 HTML 页面进行响应。我尝试添加:format => :js到技能表单中,但 rails 只是在我的浏览器中渲染了 javascript 而没有解释它。

当我查看 Web 服务器上的日志时,我没有看到任何错误。我得到:

Started POST "/skills" for 127.0.0.1 at 2012-12-31 20:02:16 -0700
Processing by SkillsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"xxxxx", "skill"=>{"description"=>"Example Skill"}, "commit"=>"Save"}
  User Load (62.8ms)  SELECT "users".* FROM "users" WHERE "users"."remember_token" = 'xxxxx' LIMIT 1
  (0.1ms)  begin transaction
  SQL (15.4ms)  INSERT INTO "skills" ("created_at", "description", "updated_at", "user_id") VALUES (?, ?, ?, ?)  [["created_at", Tue, 01 Jan 2013 03:02:16 UTC +00:00], ["description", "Example Skill"], ["updated_at", Tue, 01 Jan 2013 03:02:16 UTC +00:00], ["user_id", 1]]
  (1.4ms)  commit transaction
Redirected to http://localhost:3000/home_page
Completed 302 Found in 96ms (ActiveRecord: 79.7ms)

有什么想法吗?

4

1 回答 1

1

原因是,您不应该在 create 方法中进行重定向,因为 AJAX 请求在中间有点丢失(您可以通过 Firebug/FF 看到这一点)。

以下是示例代码:

例如:假设我有一个名为 project 的脚手架

projects_controller.rb

class ProjectsController < ApplicationController
  @project = Project.new(params[:project])
  if @project.save
      flash.now[:success] = ["#{@project.name} sucessfully created"]
  else
      flash.now[:errors] = @project.errors.full_messages 
  end
end

在视图/项目中

_form.html.erb

<div id="message"></div>
<%= form_for @project :remote => true, :html => { :class => 'form-horizontal' } do |f| %>
  <%= f.text_field :name, :class => 'span3', :placeholder => "Project name" %> 
  <%= f.submit nil, :class => 'btn btn-success' %>
<% end %>

create.js.erb

$("#message").html("<%= escape_javascript raw(flash_display) %>");

in helper

module ApplicationHelper
  def flash_display
    response = "<div class='alert #{alert_class}'>"
    response += "<button type='button' class='close' data-dismiss='alert'>x</button>"
    flash.each do |name, msg|
      msg.each do |m|
        response = response + content_tag(:p, m)  
      end
    end
    response += "</div>"
    flash.discard
    response
  end

  private
  def alert_class
    css_class = case flash.first[0]
      when :errors then "alert-error"
      when :success then "alert-success" 
      when :notifications then "alert-block"   
    end
    css_class  
  end
end

如您所见,我没有从我的创建方法重定向,保存后我只是传递状态消息。所以你的页面不会刷新,只会更新消息。

于 2013-01-01T03:53:50.273 回答