45

我是一位经验丰富的 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/

4

2 回答 2

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

js这里指定控制器方法将作为响应发回的 mime 类型;
默认 Rails 哑剧类型
如果您也尝试使用format.yaml

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

这意味着您的控制器将返回ymljs取决于客户端的要求;

{}对 ruby​​ 而言是一个;如果您不指定任何 rails 将尝试从 app/views/[contoller 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 中。

如果您确实指定了块:

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
于 2012-11-24T21:35:21.663 回答
15

我相信这是您要查找的网址:

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

这可能对某些人也有帮助,看看您实际上可以在 format.js 方法中直接渲染 js,例如,如果您只想返回一个小的一行 js 语句,并且您不想推迟一个 RJS 文件,如controller_action_name.js.erb

respond_to do |format|
  format.html { redirect_to new_admin_session_path }
  format.js   { render :js => "window.location='#{ new_admin_session_path }'" }
end
于 2017-09-12T13:46:58.733 回答