【问题标题】:How does js.erb workjs.erb 是如何工作的
【发布时间】:2011-06-04 03:49:28
【问题描述】:

最近我遇到了一些使用js.erb 的应用程序,但我不太确定如何使用它……下面是代码。有人可以帮我理解这是如何工作的吗?

routes.rb 文件中

map.resources :player_emails

我的控制器 player_emails_controller.rb 在创建操作中

def create
 @player_email = PlayerEmail.create(params[:player_email])
 if @player_email.save
  @response_txt = "The player has been emailed."
  PlayerEmailsMailer.deliver_pattern_email(@something, @player_email, request.host_with_port)
  @error = false
 else
  @error = true
  @response_txt = "Please make sure you entered your name and a valid email address."
 end
end

然后我有文件player_emails/create.js.erb

$('#player_email_ind').hide();
$('#player_email_submit').show();
$('#player_response_msg').html("<%= escape_javascript @response_txt %>").fadeIn();
<% unless @error %>
$('#player_email_form')[0].reset();
<% end %>

我知道 jquery 会发生什么,但我不知道这是如何进行 ajax 调用的。当有js.erb 时,它是否只是自动进行ajax 调用...有人可以解释它的工作方式以及为什么我不需要在控制器操作中使用respond_to 告诉它这是format.js

【问题讨论】:

  • 我只是好奇是否有编写 .js.erb 的教程...

标签: javascript ruby-on-rails ruby asp.net-ajax erb


【解决方案1】:

提交表单后,它会向/player_emails 发送一个POST。 routes.rb 中的资源声明确保请求由 PlayerEmailsController#create 处理。

控制器负责处理它接收到的每种格式。在 AJAX 调用的情况下,格式为“js”,并通过将格式字符串显式添加到 URL 的末尾 (/player_emails.js) 或(更有可能)通过从请求标头推断格式来设置。

在您的情况下,create 操作除了 AJAX 之外没有任何期望,因此它采用快捷方式并省略了 respond_toformat 块。控制器已经确定格式为“js”,因此当create 完成时,它会采用默认操作为格式(create.js.erb)呈现适当的模板。

【讨论】:

    【解决方案2】:

    如果发出 js (ajax) 请求,它将通过呈现 js.erb 文件来响应,反之亦然。

    这是正在执行的默认行为:

      respond_to do |format|
        format.js{
          render :template => 'create.js.erb'
        }
        format.html{
          render :template => 'create.html.erb'
        }
      end
    

    【讨论】:

      【解决方案3】:

      您的表单提交按钮上是否有:remote =&gt; true?如果是这样,rails.jsapplication.js 中可能有一些 JavaScript 通过 AJAX 自动提交。底线是,必须有一些 JavaScript 在某个地方进行 AJAX 调用并请求 js 或 JSON 响应,否则它将是一个 html 请求。

      至于你为什么不需要respond_to 块,我不完全确定。也许因为调用总是由 AJAX 进行,并且有一个可用的 js.erb 模板,所以它只是做它的事情而不会抱怨。是否有 html.erb 模板?如果没有,请尝试进行常规表单提交,看看它是否抱怨。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-24
        • 2016-11-13
        相关资源
        最近更新 更多