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

时间:2011-08-29 04:44:07

标签: ruby-on-rails ajax ruby-on-rails-3 ruby-on-rails-3.1 renderpartial

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

我问的原因有几点:

  1. 我只会对我的控制器进行AJAX调用;
  2. 我不会支持任何其他内容类型(例如:html,:xml等);和
  3. 我希望能够呈现不同的js.erb文件,而不是与控制器方法相同的文件(即different.js.erb
  4. 以下是一些代码作为示例。

    应用/视图/帖/ awesome.js.erb:

    alert("WOOHOO");
    

    PostsController#创建

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

    当通过AJAX调用create方法时,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:
    

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:3)

部分文件需要用下划线命名。

尝试将您的部分重命名为app/views/posts/_awesome.js.erb