js.erb文件由于未能从多个控制器传递本地文件而无法呈现部分文件

时间:2016-10-07 17:37:09

标签: javascript jquery ruby ruby-on-rails-4

我无法将本地人传递给由三个不同视图共享的部分视图,每个视图都与不同控制器中的不同动作相关。传递给它的部分和本地工作在处理html请求时没有问题,但是在发出xhr请求时我无法让它们工作。 让我告诉你我的代码,以便更好地解释自己。

所以,我有这个部分

# app/views/shared/_vote_form.html.erb

  <div id="vote_form">
  <% if post.votes.find_by(user_id: current_user.id).nil? %>
    <%= render partial: "votes/vote", locals: { postv: post, 
                                                vote: post.votes.build } %>
  <% else %>
    <%= render partial: "votes/unvote", locals: { postu: post, 
                                                  vote: post.votes.find_by(user_id: current_user.id) } %>
  <% end %>
</div>

如您所见,此部分根据if语句的结果呈现两个部分之一:

# app/views/votes/_vote.html.erb

<%= form_for([postv, vote], remote: true) do |f| %>
  <%= hidden_field_tag 'vote[vote]', 1 %>      
  <%= f.submit "Vote", class: "btn" %>
<% end %>

# app/views/votes/_unvote.html.erb

<%= form_for([postu, vote], html: { method: :delete }, remote: true) do |f| %>
  <%= f.submit "Unvote", class: "btn btn-primary" %>
<% end %>

正如我所提到的,这些部分由与不同控制器中的不同动作相关联的三个不同视图共享。

# app/views/posts/show.html.erb

<div class="post-vote-form">
  <%= render partial: "shared/vote_form", locals: { post: @post } %>
</div>

与以下控制器中的以下操作相关联:

class PostsController < ApplicationController

  def show
    @post = Post.find(params[:id])
  end
end

另一种观点

# app/views/users/feed.html.erb

<% @feed_items.each do |f| %>
  <div class="vote-button">
    <%= render partial: "shared/vote_form", locals: { post: f } %>
  </div>
<% end %>

与以下控制器#action相关联

class UsersController < ApplicationController

  def feed
    @user = User.find_by(id: current_user.id)
    @feed_items = @user.feed
  end
end

最后

# app/views/categories/other.html.erb

<% @gal_items.each do |f| %>
  ...
  <%= render partial: "shared/vote_form", locals: { post: f } %>
<% end %>

与控制器#动作相关联

class CategoriesController < ApplicationController
  def other
    @other = Category.find(7)
    @gal_items = @other.posts
  end
end

如您所见,表单发送xhr请求以创建/销毁Vote实例(我有Vote的路由嵌套在Post。这就是为什么form_for需要两个参数)。 这些请求由VotesController

中的以下操作处理
class VotesController < ApplicationController

  def create
    @post = Post.find_by(id: params[:post_id])
    @vote = @post.votes.build(vote_params)
    @vote.user_id = current_user.id
    @vote.save
    respond_to do |format|
      format.html { redirect_to @post }
      format.js 
    end
  end

  def destroy
    @vote.destroy
    respond_to do |format|
      format.html { redirect_to @post }
      format.js
    end
  end
end

这两个js.erb文件发挥作用:

# app/views/votes/create.js.erb

$("#vote_form").html("<%= escape_javascript(render :partial => 'votes/unvote', locals: { postu: @post,
                                                                                      vote: @post.votes.find_by(user_id: current_user.id)}) %>");

# app/views/votes/destroy.js.erb

$("#vote_form").html("<%= escape_javascript(render :partial => 'votes/vote', locals: { postv: @post.each,
                                                                                   vote: @post.votes.build }) %>");

我提供的最后两个js.erb文件的方式适用于视图# app/views/posts/show.html.erb,因为本地的值直接来自VotesController操作,但我无法使用找到一种方法使其适用于渲染这些部分的其他两个视图(@something.each do |f|),因为我无法将适当的值传递给本地,以使form_for参数起作用。 我已尝试使用帮助程序将值传递给本地,具体取决于URL,但没有成功。 很明显,我无法使用这些js.erb文件来呈现具有适当的本地值的部分,因为我无法从各自的控制器中检索变量。

那么,底线,有没有办法让它通过这些js.erb文件工作,还是我必须使用纯JQuery对其进行排序? 有没有人遇到过这样的事情? 对不起,我不能提出一个需要更具体答案的问题。 希望你们能帮忙。

1 个答案:

答案 0 :(得分:0)

你试过这个吗?

class UsersController < ApplicationController

  def feed
    @post = Post.find(params[:id])
    @user = User.find_by(id: current_user.id)
    @feed_items = @user.feed
  end
end

class CategoriesController < ApplicationController
  def other
    @post = Post.find(params[:id])
    @other = Category.find(7)
    @gal_items = @other.posts
  end
end