我正在尝试将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如何处理这些案件?
答案 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
个文件。它们以类似的方式运行,允许访问实例变量和辅助方法。