rails respond_to format.js API

46

我是一位有经验的JAVA和C++开发者,现在正在尝试理解Rails的工作原理。

我得到了以下代码:

respond_to do |format|
      if @line_item.save
        format.html { redirect_to store_url }
        format.js { render :json => @line_item, :mime_type => Mime::Type.lookup('application/json'), 
                :callback => 'javascriptFunction' }

我一直在搜索定义我可以在 format.js {} 中传递什么的API,但是我找不到……

首先: format.js 是什么类型的语句?它是一个变量吗?

最重要的是:我可以传递哪些属性到 format.js {} 中?你可以给我直接链接吗?我已经在 http://api.rubyonrails.org/ 上搜索过了。

2个回答

118
respond_to do |format|
  format.js # actually means: if the client ask for js -> return file.js
end

js在这里指定了控制器方法将作为响应发送回去的MIME类型;
默认的Rails MIME类型
如果您还尝试使用format.yaml

respond_to do |format|
  format.js
  format.yaml
end

这意味着您的控制器将根据客户端请求返回ymljs

{}在Ruby中是一个; 如果您没有指定,Rails会尝试从app/views/[controller name]/[controller method name].[html/js/...]渲染默认文件。

# app/controllers/some_controller.rb
def hello
  respond_to do |format|
    format.js
  end
end

将查找/app/views/some/hello.js.erb; //至少在Rails v. 2.3中。

如果您指定了block:

respond_to do |format|
    # that will mean to send a javascript code to client-side;
    format.js { render             
        # raw javascript to be executed on client-side
        "alert('Hello Rails');", 
        # send HTTP response code on header
        :status => 404, # page not found
        # load /app/views/your-controller/different_action.js.erb
        :action => "different_action",
        # send json file with @line_item variable as json
        :json => @line_item,
        :file => filename,
        :text => "OK",
        # the :location option to set the HTTP Location header
        :location => path_to_controller_method_url(argument)
      }

  end

如果您想指定要调用的js文件,而不是与方法名称相同的约定,该怎么办?我正在尝试在不同的控制器中使用相同的js文件。 - kakubei
2
format.js { :render ... 应该改为 format.js { render ...。我想编辑它,但是我必须更改超过6个字符才能保存更改。 - d_rail
问题仍然存在:format.js是什么类型的语句,是一个变量吗? - Lokomotywa
2
@Ferenjito,“format”是“respond_to do |format|”块中的一个变量,它保存了一个对象。在该对象上调用“.js”定义了JavaScript响应类型的行为。有点像DSL。 - ted
1
仅使用 format.js 会抛出错误“未知格式”,但使用 format.html 却允许我在不进入 js.erb 文件的情况下进行操作。 - Mani

16

我相信这就是你要找的URL:

https://apidock.com/rails/ActionController/MimeResponds/InstanceMethods/respond_to

对于一些人来说,这也可能很有帮助,因为你可以直接在format.js方法中呈现JavaScript代码,例如,如果你只有一行小的JavaScript语句要返回,并且不想使用类似controller_action_name.js.erb的RJS文件:

respond_to do |format|
  format.html { redirect_to new_admin_session_path }
  format.js   { render :js => "window.location='#{ new_admin_session_path }'" }
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接