在Rails中通过JavaScript查询遇阻:JS变量无法被ERB识别
问题根源
你遇到的核心问题是服务器端ERB代码与客户端JavaScript的执行时机完全脱节:
#{Post.find_by(id: ...)}是Rails的ERB模板代码,在页面发送给浏览器前就已经在服务器执行完毕;- 而
post_value是浏览器加载页面后,运行JavaScript才生成的客户端变量,服务器根本无法读取这个值,直接把它塞进ERB标签里自然会失效。
解决方案
根据你的业务场景,推荐以下几种可行方案:
方案1:AJAX动态请求后端接口(最通用)
通过前端发起AJAX请求,把获取到的post_value传给后端接口,再返回对应Post的数据。
步骤1:配置后端路由与控制器
# config/routes.rb get 'posts/:id', to: 'posts#show', format: :json
# app/controllers/posts_controller.rb def show @post = Post.find(params[:id]) render json: @post end
步骤2:前端JS发起请求
var post_value = $(".post").val(); // 获取帖子ID $.getJSON(`/posts/${post_value}`, function(post) { // 拿到post数据后执行后续逻辑 console.log(post.title); // 示例:访问帖子标题 });
方案2:预加载所有Post数据(适合数据量小的场景)
如果系统内帖子数量不多,可以在页面渲染时把所有Post数据转成JSON存在全局变量里,前端直接用ID匹配查找。
ERB模板预存数据
<script> // 页面加载时把所有Post数据存入全局变量 window.allPosts = <%= Post.all.to_json.html_safe %>; </script>
前端JS查找数据
var post_value = $(".post").val(); var post = window.allPosts.find(item => item.id == post_value); // 处理找到的post数据
方案3:用data属性预存单个Post数据(适合单帖页面)
如果当前页面只对应一个帖子,可以把Post数据直接存在页面元素的data-*属性里,前端直接读取。
ERB模板设置data属性
<input type="hidden" class="post" value="<%= @post.id %>" data-post="<%= @post.to_json.html_safe %>">
前端JS读取数据
var post = JSON.parse($(".post").data("post")); // 直接使用post数据
内容的提问来源于stack exchange,提问作者Samuel D.
相关产品推荐
相关产品推荐

