我正在渲染一个部分渲染表单,使用ajax(我不能直接渲染表单)。当我在没有ajax的情况下渲染表单时发布注释工作正常但是使用ajax似乎部分无法访问@post变量。
<%= link_to "Render form", submit_comment_path, :remote => true %>
<div id="form">
</div>
我有一个submit_comment.js文件,如下所示:
$("#form").html("<%= j render(partial: 'comment_partial', locals: {post: @post}) %>");
comment_partial视图:
<%= render 'comments/form' %>
表单视图:
<%= simple_form_for [post, Comment.new] %>
...
submit_comment_path路线:
get '/submit_comment', to: 'posts#submit_comment', as: :submit_comment
帖子控制器(它在节目页面上呈现):
def show
@post = Post.find(params[:id])
end
def submit_comment
respond_to do |format|
format.html
format.js
end
end
和评论控制器:
def create
@post = Post.find(params[:post_id])
end
如果我尝试发布新评论,则会向我发送路由错误并转到/posts//comment
。将post.id
放在comment_partial中会给我一个未定义的错误。
答案 0 :(得分:1)
难题的大部分是理解实体变量(在这个例子中为@post)在Controller渲染任何内容后立即消失。
在渲染显示页面时正确分配@ post:
def show
@post = Post.find(params[:id])
end
然而,@ post消失了 show.html.erb 完成渲染的第二个。当您点击链接以点击提交评论方法时,没有创建@post ...
def submit_comment
# No instance variables here! :(
respond_to do |format|
format.html
format.js
end
end
这意味着 submit_comment.js 文件不知道要为哪个帖子生成表单。
然而,它并不像将另一个Post.find(params [:id])抛入submit_comment方法那么简单。你需要:
它可能看起来像这样......
<强>的routes.rb 强>
...
resources :posts do
member do
get 'submit_comment'
end
end
...
阅读会员路线at the Rails Guide。还有其他方法可以完成类似的路线。
<强>文章/ show.html.erb 强>
<%= link_to "Render form", submit_comment_post_url(@post), :remote => true %>
请注意,如果您使用成员路由,则Rails默认网址助手与您获得的网址不同。
<强> posts_controller.rb 强>
def submit_comment
@post = Post.find(params[:id])
...
end
希望有所帮助!快乐的形式!