是否可以在不使用respond_to方法和使用非常规文件名的情况下呈现js.erb?

Joh*_*ohn 3 ajax renderpartial ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

是否可以在不使用respond_to方法的情况下呈现js.erb以响应AJAX请求?

我问的原因有以下几点:

  1. 我只会向控制器发出AJAX调用;
  2. 我不会支持任何其他内容类型(即:html,:xml等); 和
  3. 我希望能够渲染一个不同的js.erb文件,而不是一个与控制器方法相同的文件(即different.js.erb)

以下是一些代码作为示例.

应用程序/视图/职位/ awesome.js.erb:

alert("WOOHOO");
Run Code Online (Sandbox Code Playgroud)

PostsController#创建

def create
  @post = Post.new(params[:task])
  if @post.save 
    render :partial => 'awesome.js.erb'
  end
end
Run Code Online (Sandbox Code Playgroud)

create通过AJAX调用该方法时,Rails会抱怨部分丢失:

ActionView::MissingTemplate (Missing partial post/awesome.js, application/awesome.js with {:handlers=>[:erb, :builder, :coffee, :haml], :formats=>[:js, "application/ecmascript", "application/x-ecmascript", :html, :text, :js, :css, :ics, :csv, :xml, :rss, :atom, :yaml, :multipart_form, :url_encoded_form, :json], :locale=>[:en, :en]}. Searched in:
Run Code Online (Sandbox Code Playgroud)

Joh*_*ohn 5

虽然Kieber S.回答是正确的,但我认为这是另一种方法,对于那些想要支持"传统"创建js.erb文件方法的人来说,这种方法很有用.

而不是render :partial使用render :template.但是,这里需要注意的是,模板的搜索路径不会自动限定为控制器的名称(即app/views/posts).相反,Rails开始于app/views/.因此,要引用"模板",您需要添加要查看的子文件夹(如果它不在根目录中).在我的情况下,我不得不补充posts.

def create
  @post = Post.new(params[:task])
  if @post.save 
    # using :template and added 'posts/' to path
    render :template => 'posts/awesome.js.erb'
  end
end
Run Code Online (Sandbox Code Playgroud)

这里的好处是,如果你碰巧想要使用该respond_to方法并遵循惯例,则不需要js.erb通过删除下划线来重命名.