2017-07-29 96 views
2

我搜索了高和低的答案,并且还没有找到任何解决我的问题。我有一个显示所有用户留言板的页面,每个留言板都有一个与其关联的“game_type”属性。我只是试图更新所有的消息,而无需使用ajax刷新。我已经设置了范围,我的控制器现在看起来是这样的:respond_to没有正确渲染index.js.erb

def index 
    @microposts = Micropost.where(nil).paginate(page: params[:page], per_page: 12) 
    filtering_params(params).each do |key, value| 
     @microposts = @microposts.public_send(key, value) if value.present? 
    end 
    @micropost = current_user.microposts.build 

    respond_to do |format| 
     format.html { } 
     format.js { } 
    end 

end 

如果我有我的网页上只是一个标准的链接,如<%= link_to 'Mode', {controller: 'microposts', action: 'index', :game_type => 'Mode'} %>我的浏览器重定向到http://localhost:3000/microposts?game_type=Mode并显示正确的结果。现在,当试图使ajax变成魔法时,就会出现问题,所以我可以跳过重定向并将结果呈现在页面上。

除其他事项外,我有这个形式我index.html.erb视图:

<%= form_tag microposts_path, method: :get, remote: true do %> 
    <%= select_tag :game_type, options_for_select([['Mode', 'Mode'], ['Mode2', 'Mode2']]), onchange: 'this.form.submit()' %> 
<% end %> 

,它允许用户通过选择筛选结果。我有一个包含以下行的index.js.erb的文件:

$(.row.posts").html("<%= j (render @microposts) %>");` 

然而,从下拉列表中选择一个值,当下来,我format.js块不被击中的一切,它是治疗我的要求作为HTML 。我发现解决这个问题的唯一方法是在我的表单中添加microposts_path(:format => :js)。这的作品。首先,我得到了一个交叉错误,我通过将protect_from_forgery except: :index添加到我的控制器中解决了这个错误。现在,我的format.js块被打了,它正在调用我的index.js.erb。但是,JS调用的文件中,我已经被渲染为文本,并且我被重定向到一个空白页面,只是$(.row.posts").html("the html of my rendered posts");

该文件中的任何内容实际上都不被视为JS。我注意到,我得到这个错误我的浏览器控制台:

Resource interpreted as Document but transferred with MIME type text/javascript: "http://localhost:3000/microposts.js?utf8=%E2%9C%93&game_type=Mode". 

奇怪的是,我已经创建和销毁处理这只是罚款的行动。我的application.js文件既

//= require jquery 
//= require jquery_ujs 

而且我没有任何需要在format: :js通过与我的其他行为。请帮忙!!我可能会远离基地,从处理这个事情的方式来看,我找不到任何能够为此工作的东西!

+1

使用谷歌浏览器,您可以使用开发工具(F12)来检查您的客户端发送的不同请求以及服务器的响应。你可以用它来检查请求标题,看看是否在某个时候发出了一个错误格式的请求(例如:格式为html,但响应仅包含JS) – MrYoshiji

+0

感谢您的回复!我想清楚了,在下面发布了答案。 – Luminusss

回答

0

所以事实证明,onchange: 'this.form.submit()'存在一个问题,我的表单跳过了remote: :true部分。希望这有助于未来的人!