【问题标题】:Rails Ajax render partial with local variableRails Ajax 使用局部变量渲染部分内容
【发布时间】:2015-07-22 14:11:25
【问题描述】:

嘿,我正在尝试使用 ajax 渲染部分内容,一切都以 rails 正常形式工作,但是当我使用 ajax 局部变量渲染部分内容时,我正在尝试创建一个喜欢和不喜欢的系统,我已经创建了一个这里称为 FeedLike 的模型我可以使用简单的创建和销毁来喜欢和不喜欢,但是当我使用 ajax 时,我在下面调用此操作:

$('#feed_like').html("<%= j render :partial => 'shared/dislike', :locals => { feed: @feed= @feed} %>");

我收到错误没有路线匹配

{:action=&gt;"destroy", :controller=&gt;"feed_likes", :feed_id=&gt;nil, :user_id=&gt;1}

我不喜欢的链接是这样的,它是下面的部分:

 <div id="feed_dislike">
    <%= link_to "Dislike",{ :action => 'destroy', :controller => 'feed_likes', :feed_id => @feed, :user_id => current_user.id }, class: "btn btn-primary" %>
        </div>

当我不使用 ajax 时一切正常,但是当我渲染部分时,为什么 @feed 没有得到任何价值,我应该做什么。获取 feed.id 的值。 feed.id 来自名为 Feed 的模型,它正在查看中,我正在使用 partials 渲染这两种形式。

现在我正在粘贴一些代码,这些代码将为您提供我正在做的事情:

     #shared/_feed.html.erb
    <% if @feed_items.try(:any?) %>  
        <ol class="microposts">
            <%= render @feed_items %>

          </ol>
          <%= will_paginate @feed_items %>
        <% end %>

而@feed_items 来自:

      #feeds/_feed.html.erb
     <li id="feed-<%= feed.id %>">
      <%= image_tag(current_user.avatar.url(:thumb), :size => '50x50') %>
      <span class="user"><%= link_to feed.user.name, feed.user %></span>
      <span class="content"><%= feed.content %></span>
      <span class="timestamp">
        Posted <%= time_ago_in_words(feed.created_at) %> ago.
      </span>

      <%  @like =FeedLike.where(:user_id => "#{current_user.id}", :feed_id => "#{feed.id}")
        %>


    <%= render :partial => 'shared/feed_like', locals: { feed: @feed= feed.id} %>
    </li>

现在 feed_like 部分:

    #shared/_feed_like.html.erb
   <% if @like.count == 0 %> 

              <%= render :partial => 'shared/like', locals: { feed1: @feed= @feed} %>

              <% else %>

           <%= render :partial => 'shared/dislike', locals: { feed:  @feed} %>
            <% end %>

控制器代码:

     class FeedsController < ApplicationController

            before_action :authenticate_user! ,only: [:create, :destroy]
          def create
              @feed = current_user.feeds.build(feed_params)
              @feed_likes = FeedLike.new
              if @feed.save
                 #redirect_to root_url
                respond_to do |format|

                format.html { redirect_to root_url }
                format.js
              end
               else
              respond_to do |format|

                format.html { redirect_to root_url }
                format.js { render :js=>'alert("you can not leave post empty");' }
              end
            end
            end

            def destroy
            end

            private

              def feed_params
                params.require(:feed).permit(:content)
              end
          end

FeedsLike 控制器:

                class FeedLikesController < ApplicationController
            before_action :authenticate_user! ,only: [:create, :destroy]

              def index
                @fees = FeedLike.all
                respond_to do |format|

                        format.html 
                        format.js


                        end
              end
            def update
                @feed_likes = FeedLike.find_or_create_by(feed_like_params)
                    respond_to do |format|
                        if @feed_likes.save
                        format.html { redirect_to root_url, notice: 'Like ' }

                        else

                        end
                   end
            end
              def create
                    @feed_likes = FeedLike.find_or_create_by(:feed_id => params[:feed_id],:user_id =>params[:user_id])
                    respond_to do |format|
                        if @feed_likes.save
                        format.html { redirect_to root_url, notice: 'Like ' }
                        format.js
                        else

                        end
                   end
              end


              def delete

              end

              def destroy
                  @feed_likes = FeedLike.where(:feed_id => params[:feed_id],:user_id =>params[:user_id])
                   respond_to do |format|
                       if @feed_likes.destroy_all
                       format.html { redirect_to root_url, notice: 'Unlike ' }
                       else

                       end
                   end
              end
              def feed_like_params
                  params.require(:feed_like).permit(:user_id, :feed_id)
                  #params[:market_place]
                end


              end

还有静态页面控制器:

class StaticPagesController < ApplicationController
                before_action :authenticate_user!
              def home

             if user_signed_in?
                 @feed_likes = current_user.feed_likes.new
                 @feed  = current_user.feeds.build
                 @feed_items = current_user.feed.paginate(page: params[:page])
                 # @likes = Feed.find(:all, 
                 #    :select => '"feeds".id, "feeds".content, count("feed_likes".id) as Like', 
                 #    :from => :feeds, 
                 #    :left_join => '"feed_likes"', 
                 #    :on => '"feeds".id = "feed_likes"."feed".id', 
                 #    :limit => 5
                 #  )

                 # @like =Feed.find_by_sql "

                 #        SELECT id
                 #        FROM feed_likes
                 #        WHERE user_id = #{current_user.id}
                 #        AND feed_id =#{feed.id}
                 #        LIMIT 0 , 30

                 #    "
                end
              end

              def help
              end


              def about
              end

             def contact
             end


            end

【问题讨论】:

  • 试试这个$('#feed_like').html("&lt;%= j render :partial =&gt; 'shared/dislike', :locals =&gt; { feed: @feed} %&gt;");
  • 我试过这个但没有用
  • 这是 $('#feed_like').html("&lt;%= j render :partial =&gt; 'shared/dislike', :locals =&gt; { feed: @feed} %&gt;"); 对 feed_likes 控制器中的操作的响应。你的@feed 对象真的存在于文件中吗?
  • 不,它来自 'shared/feed_like', locals: { feed: @feed= feed.id} %> location #feeds/_feed.html.erb
  • 我说的是在控制器动作之后。哪个控制器动作是这个响应

标签: ruby-on-rails ajax partial


【解决方案1】:

您的提要为 nil,这就是它崩溃的原因

请将此添加到您的 feed_likes 控制器中。

before_action :get_feed ,only: [:create, :destroy]

并在底部添加此方法

def get_feed
  @feed= Feed.find(params[:feed_id])
end

【讨论】:

    【解决方案2】:

    您的 javascript 文件中的 Feed 定义看起来不正确。试试这个:

    $('#feed_like').html("<%= j render :partial => 'shared/dislike', :locals => { feed: @feed} %>");
    

    【讨论】:

    • 添加控制器详细信息
    猜你喜欢
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多