Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 刷新页面时覆盖所有部分的rails ajax_Javascript_Ruby On Rails_Ajax - Fatal编程技术网

Javascript 刷新页面时覆盖所有部分的rails ajax

Javascript 刷新页面时覆盖所有部分的rails ajax,javascript,ruby-on-rails,ajax,Javascript,Ruby On Rails,Ajax,我对rails中ajax的简单示例进行了简单的修改: 我正在尝试创建一个用户显示视图,在该视图中,按下按钮即可创建新的帖子。这些帖子都列在同一显示页面的用户下方,并在创建时显示 这些帖子创建得很好,并且正确地显示在页面上,但是当我刷新页面时 @post = User.posts.build() 覆盖以前创建的所有帖子,并为每个帖子提供nul id。 另外,将create.js.erb放在views文件夹中是正确的,还是应该放在assets/javascripts文件夹中 这是我的档案:

我对rails中ajax的简单示例进行了简单的修改:

我正在尝试创建一个用户显示视图,在该视图中,按下按钮即可创建新的帖子。这些帖子都列在同一显示页面的用户下方,并在创建时显示

这些帖子创建得很好,并且正确地显示在页面上,但是当我刷新页面时

  @post = User.posts.build() 
覆盖以前创建的所有帖子,并为每个帖子提供nul id。 另外,将create.js.erb放在views文件夹中是正确的,还是应该放在assets/javascripts文件夹中

这是我的档案:

用户控制器

def show
    @user = User.find(params[:id])
    @posts = Post.all
    @post = @user.posts.build
end
def create
  puts params[:post][:user_id]
  @user = User.find(params[:post][:user_id])
  puts @user
  @post = @user.posts.build()
  respond_to do |format|
    if @post.save
      format.html { redirect_to @post, notice: 'Post was successfully created.' }
      format.js   {}
      format.json { render json: @post, status: :created, location: @post }
    else
      format.html { render action: "new" }
      format.json { render json: @post.errors, status: :unprocessable_entity }
    end
    Rails.logger.info(@post.errors.inspect) 
  end
end

def index
    @posts = Post.all
    @post = Post.new
end
users/show.html.erb

<%= "user-id: #{@user.id}" %>

<ul id="posts">
<%= render :partial => @posts %>
</ul>


<%= form_for(@post, remote: true) do |f| %>
  <%= f.hidden_field :user_id, :value => @user.id %>
  <%= f.submit %>
<% end %>
<ul id="posts">
  <% @posts.each do |post| %>
    <li>
      <%= post.id %>
    </li>
  <% end %>
</ul>
posts/_post.html.erb

 <li><%= @post.id %></li>
  • posts/create.js.erb

     $("<%= escape_javascript(render @post) %>").appendTo("#posts");
    
    $(“”)。附加到(“#posts”);
    
    是的,你是对的

    create.js.erb
    带有后缀
    erb
    ,以帮助您向其中添加代码ruby

    在这个文件中编写代码,就像在view
    html.erb
    上使用语法编写javascript代码一样

    <script>
      $("<%= escape_javascript(render @post) %>").appendTo("#posts");
    </script>
    
    
    $(“”)。附件(“#posts”);
    
    是的,你是对的

    create.js.erb
    带有后缀
    erb
    ,以帮助您向其中添加代码ruby

    在这个文件中编写代码,就像在view
    html.erb
    上使用语法编写javascript代码一样

    <script>
      $("<%= escape_javascript(render @post) %>").appendTo("#posts");
    </script>
    
    
    $(“”)。附件(“#posts”);
    
    找到了一个解决方法,避免使用“post partial”来显示较旧的帖子:

    编辑:users/show.html.erb

    <%= "user-id: #{@user.id}" %>
    
    <ul id="posts">
    <%= render :partial => @posts %>
    </ul>
    
    
    <%= form_for(@post, remote: true) do |f| %>
      <%= f.hidden_field :user_id, :value => @user.id %>
      <%= f.submit %>
    <% end %>
    
    <ul id="posts">
      <% @posts.each do |post| %>
        <li>
          <%= post.id %>
        </li>
      <% end %>
    </ul>
    

    我不认为这是一个理想的解决方案,但它目前运行良好。

    找到了一个解决方法,避免使用“post partial”来显示较旧的帖子:

    编辑:users/show.html.erb

    <%= "user-id: #{@user.id}" %>
    
    <ul id="posts">
    <%= render :partial => @posts %>
    </ul>
    
    
    <%= form_for(@post, remote: true) do |f| %>
      <%= f.hidden_field :user_id, :value => @user.id %>
      <%= f.submit %>
    <% end %>
    
    <ul id="posts">
      <% @posts.each do |post| %>
        <li>
          <%= post.id %>
        </li>
      <% end %>
    </ul>
    
    我认为这不是一个理想的解决方案,但目前效果很好。

    问题 partial呈现所有新帖子的原因是,在partial中使用的是实例变量
    @post
    ,而不是局部变量
    post

    userscoontroller#show
    操作中,设置
    @post=@user.posts.build
    。在分部中渲染
    时,引用的是来自控制器并设置为新post的同一变量

    似乎所有以前创建的帖子都被“空”掉了,但实际上只是你在不断地呈现一个新帖子,而不是现有的帖子

    解决方案 您需要更新分部变量以使用局部变量,而不是实例变量

  • 当您呈现这样的记录集合时,Rails会自动向您提供此局部变量

    <%= render @user.posts %>
    
    
    
    或者

    <%= render partial: "posts/post", collection: @user.posts %>
    
    
    
    未来如何避免 这是一个非常常见的错误,很容易被忽略

    基于这个原因,我的建议是完全

    资源
    问题 partial呈现所有新帖子的原因是,在partial中使用的是实例变量
    @post
    ,而不是局部变量
    post

    userscoontroller#show
    操作中,设置
    @post=@user.posts.build
    。在分部中渲染
    时,引用的是来自控制器并设置为新post的同一变量

    似乎所有以前创建的帖子都被“空”掉了,但实际上只是你在不断地呈现一个新帖子,而不是现有的帖子

    解决方案 您需要更新分部变量以使用局部变量,而不是实例变量

  • 当您呈现这样的记录集合时,Rails会自动向您提供此局部变量

    <%= render @user.posts %>
    
    
    
    或者

    <%= render partial: "posts/post", collection: @user.posts %>
    
    
    
    未来如何避免 这是一个非常常见的错误,很容易被忽略

    基于这个原因,我的建议是完全

    资源

    谢谢你的回复,你明白为什么我的帖子列表在刷新页面后都变成Post.new吗?在posts\u controller/index上@Post=Post.new是什么意思?我已经删除了,因为这是一个错误,但是用户显示视图仍然将每个帖子显示为post.new,而不是单独的帖子。我认为您应该将文件
    posts/_post.html.erb
    posts/create.js.erb
    移动到文件夹
    views/users
    下,谢谢您的回复,你明白为什么我的帖子列表在刷新页面时都变成了Post.new吗?在posts\u controller/index上@Post=Post.new是什么意思?我已经删除了,因为这是一个错误,但是用户show视图仍然将每个帖子显示为post.new,而不是单独的帖子。我认为您应该将文件
    posts/_post.html.erb
    posts/create.js.erb
    移动到文件夹
    views/users
    下。非常感谢您的回答,我会将其作为一项规则,以避免部分中的实例变量。非常感谢您的回答,我将制定一条规则,避免在部分中使用实例变量