Rails 3.1:使用'respond_to ... format.js'而不使用'page'变量的新方法

时间:2011-09-15 21:35:11

标签: javascript ruby-on-rails ruby ajax ruby-on-rails-3

我正在尝试将Ruby on Rails更新为 3.1 版本。我关注了Upgrading to Rails 3.1截屏视频,除了声明

外,所有内容似乎都有效
format.js { render(:update) { |page| page.redirect_to @article } }

在许多控制器中,我的代码如下:

def create
  ...

  respond_to do |format|
    format.js { render(:update) { |page| page.redirect_to @article } }
  end
end

在上述所有情况下,当我尝试提交执行JS请求的相关表单时,我收到以下错误:

ActionView::MissingTemplate (Missing template articles/update, application/update with {:handlers=>[:erb, :builder, :coffee], :formats=>[:js, :html], :locale=>[:en, :en]}. Searched in:
  * "/<MY_PROJECT_PATH>/app/views"
):

app/controllers/articles_controller.rb:114:in `create'

Rendered /<...>/.rvm/gems/ruby-1.9.2-p136/gems/actionpack-3.1.0/lib/action_dispatch/middleware/templates/rescues/missing_template.erb within rescues/layout (0.3ms)

我知道问题与RJS模板有关,因为它们在3.1版本中不再可用。因此,为了运行一些JavaScript代码,在我的控制器文件中,我可能\应该\可以插入一些JavaScript代码,如下例所示:

format.js { render :js => "alert('Hello Rails');" }

BTW :... 但是是否建议直接在控制器文件中使用JavaScript代码?

考虑create控制器操作中的上述代码,我想在成功提交后将用户重定向到@article路径。我能做到:

format.js { render :js => "window.location.replace('#{article_url(@article)}');" }

..但是,如何通过“Ruby on Rails方式做事”来做同样的事情? RoR 3.1如何处理这些案件?

2 个答案:

答案 0 :(得分:14)

我会选择:

render js: %(window.location.href='#{article_path @article}')

或者在application_controller.rb

中添加一些内容
def js_redirect_to(path)
  render js: %(window.location.href='#{path}') and return
end

然后在你的控制器中你可以打电话:

js_redirect_to(article_path @article)

注意我刚刚做了这个 - 未经测试:)

答案 1 :(得分:5)

建议不要直接在控制器文件中使用javascript代码。

相反或.rjs,您可以使用.js.erb个文件。它们以类似的方式运行,允许访问实例变量和辅助方法。