我是Rails的新手,我遇到了无法渲染.js.erb文件的问题。我认为问题的根源在于Rails的内部路由机制要求我命名和配置我的文件,但我缺少一两件,我不知道如何寻找需要修复的内容
我有一个HTML视图,其中包含指向控制器操作的链接:
<%# snip %>
<div id="holding_issues_list">
<%= link_to "Show issues on hold", {
:action => "show_user_issues",
:controller => "support",
:issue_type => "holding",
:user_id => @user.id },
:remote => true %>
</div>
<%# snip %>
我认为(但我不确定):remote => true
会导致链接进行AJAX调用。
这是控制器app/controllers/support_controller.rb
中的相应控制器操作:
def show_user_issues
@target_div = params[:target_div] || "holding_issues_list"
user = User.find(params[:user_id])
issue_type = params[:issue_type]
#snip - set the value of @issues
end
我希望在控制器退出时呈现名为show_user_issues.js.erb
并放在app/views/support
中的文件:
$("#<%= @target_div %>").show();
alert('test');
$("#<%= @target_div %>").html(
"<%= escape_javascript render :partial => '_show_user_issues', :locals => {:target_div => @target_div, :issues => @issues} %>");
这是app/views/support/_show_user_issues.html.erb
,我想要show_user_issues.js.erb
呈现的部分:
<% for issue in @active_issues %>
<div id="issue_<%= issue.id %>_display">
<%= render :partial => 'show_issue_mini', :locals => {:issue => issue} %>
</div>
<% end %>
当我尝试单击原始HTML视图中的链接时,没有任何反应。当我在新标签中打开它时,收到以下错误消息:
缺少模板
缺少模板支持/ show_user_issues, 带有{:locale =&gt; [:en]的application / show_user_issues, :handlers =&gt; [:builder,:erb],:formats =&gt; [:html]}。搜索范围:* “/ home /&lt;&gt; / app / views”* “/home/<>/gems/kaminari-0.14.1/app/views”
我放入alert('test')
的{{1}}没有出现,所以我认为 Rails在渲染该文件时被挂起 - 也就是路由机制找不到它。我该如何纠正这个问题?
P.S。我仔细检查了我输入的所有文件名与代码库中的完全相同。
答案 0 :(得分:3)
更改您的控制器操作以处理请求类型。
def show_user_issues
@target_div = params[:target_div] || "holding_issues_list"
user = User.find(params[:user_id])
issue_type = params[:issue_type]
#snip - set the value of @issues
respond_to do |format|
format.js
end
end
如果.js
,这将检查请求的格式:remote => true
。因此它将通过呈现show_user_issues.js.erb
文件来处理它。
答案 1 :(得分:2)
我在应用Manoj Monga的答案之后遇到的其他一些问题,我怀疑其他新的Rails开发人员可能会遇到这样的问题:
在show_user_issues.js.erb
,我有
[...].html("<%= escape_javascript render :partial => '_show_user_issues',[...]
'_show_user_issues'
之前的下划线导致ERB构建器失败。它应该是'show_user_issues'
。
在_show_user_issues.html.erb
,我有
<% for issue in @active_issues %>
如果仔细查看show_user_issues.js.erb
,我会将变量命名为@issues
,而不是@active_issues
:
[...]:locals => {:target_div => @target_div, :issues => @issues}[...]
所以我将HTML部分中的行更改为
<% for issue in @issues %>
在最后几次更改后,我添加的新功能按预期工作。