使用ajax使用表单呈现两个部分

时间:2015-06-09 19:26:51

标签: ruby-on-rails

我正在渲染一个部分渲染表单,使用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中会给我一个未定义的错误。

1 个答案:

答案 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方法那么简单。你需要:

  1. 定义依赖帖子ID的路线
  2. 更改 show.html.erb 中的链接以包含特定的@ post.id
  3. 然后找到相应的帖子来为。
  4. 创建评论

    它可能看起来像这样......

    <强>的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 
    

    希望有所帮助!快乐的形式!