rails respond_to format.js API

时间:2012-11-24 20:12:36

标签: ruby-on-rails ruby syntax

我是一名经验丰富的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' }

我一直在搜索api,它定义了我可以在format.js {}内传递的内容,但我找不到..

首先:format.js是什么类型的陈述,是变量?

最重要的是:我可以将哪些属性传递给format.js {}?你能通过直接链接吗?我搜索了http://api.rubyonrails.org/

2 个答案:

答案 0 :(得分:100)

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

js这里指定一个mime-type,控制器方法将作为响应发送回来;
Default Rails mime-types
如果您还尝试使用format.yaml

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

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

就红宝石而言,

{}block; 如果你没有指定任何rails将尝试从app / views / [控制器名称] / [控制器方法名称]渲染默认文件。[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

答案 1 :(得分:7)

我相信这是你要找的网址:

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

对于某些人来说,这可能也会有所帮助,看看你可以直接在format.js方法中渲染js,例如,如果你只想要返回一个小的一行js语句,那么 don 't 想要推迟到像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