0

Rails アプリケーションのフォームで AJAX を動作させようとしていますが、約 75% 進んでいます。人がアクティビティを作成し、そのアクティビティにスキルをタグ付けできるフォームがあります。フォーム内で新しいスキルを作成できる機能を提供したいと考えています。「Create a New Skill」リンクをフォームに置き換えて、レコードを問題なく保存できます。私の問題は、レコードが保存された後、レールがフォームのあるページに戻るのではなく、ホームページにリダイレクトし続けることです。ユーザーが典型的な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 %>

私のスキルコントローラー (New メソッドと Create メソッド):

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

その理由は、AJAX リクエストが途中で失われるため、create メソッド内でリダイレクトを行うべきではないためです (これは Firebug/FF を介して確認できます)。

以下はサンプルコードです。

例:プロジェクトと呼ばれる足場があると仮定します

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 に答える