从另一个方法ActionController :: UnknownFormat调用时,部分渲染不起作用

时间:2018-03-02 01:37:41

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 devise

我有一个在我的主页面上进行部分渲染的功能。如果直接从其中一个链接调用该方法,则该方法有效。方法如下:

  def show_card
    @activity = Activity.find(params[:id])
    respond_to do |format|               
      format.js
    end
  end

我需要从另一个方法调用此方法,或者至少呈现此方法呈现的相同内容,但使用不同的参数。我的第二种方法是:

  def like_activity
    @user = current_user
    @activity = Activity.find(params[:id])
    @user.like_activity!(@activity)
    all = Activity.all
    notWanted = Activity.where(id: Activity.joins(:memberships).where({ "memberships.user_id" => current_user.id})).or(Activity.where(id: Activity.joins(:likes).where({"likes.user_id" => current_user.id}).where.not("likes.user_likes_activity" => nil)))
    queue = all - notWanted
    nextActivity = queue.first()
    redirect_to action: 'show_card', controller: 'pages', id:nextActivity.id
  end

基本上,在您喜欢某个活动之后,该方法应调用show_card并显示新活动。但是,我收到以下错误:

  

的ActionController :: UnknownFormat

虽然这是我在控制台上输出的输出:

> Redirected to http://localhost:3000/pages/show_card?id=88 Completed
> 302 Found in 99ms (ActiveRecord: 59.6ms)
> 
> 
> Started GET "/pages/show_card?id=88" for 127.0.0.1 at 2018-03-01
> 17:12:35 -0800 Processing by PagesController#show_card as HTML  
> Parameters: {"id"=>"88"}   User Load (6.5ms)  SELECT  "users".* FROM
> "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2 
> [["id", 2], ["LIMIT", 1]]   Activity Load (6.3ms)  SELECT 
> "activities".* FROM "activities" WHERE "activities"."id" = $1 LIMIT $2
> [["id", 88], ["LIMIT", 1]] 
> Completed 401 Unauthorized in 23ms`
> (ActiveRecord: 12.8ms)
> 
> 
>    ActionController::UnknownFormat (ActionController::UnknownFormat): 
> app/controllers/pages_controller.rb:13:in `show_card'

我很遗憾我错过了什么。我也在使用Devise,我不知道这是否与401有关 - 未经授权。如果您对可能发生的事情有任何了解,如果您能告诉我,我们将非常感激。谢谢!

编辑:虽然我还没弄明白,但我认为问题在于redirect_to是HTML,而格式是js。也就是说,我仍然没有想出如何在AJAX中进行部分渲染。

1 个答案:

答案 0 :(得分:1)

您的错误确实是ajax中的from django.db.models import Case, Value, When queryset.update(active=Case( When(active=True, then=Value(False)), When(active=False, then=Value(True)), )) 类型与request之间的错误。

您可以controller respond_totext/html直接询问render_to_string,或者我通常喜欢做什么,要求action,并application/json与此类似:

respond_to

然后只需选择前端的def some_ajax_action html = (render_to_string partial: 'some/partial/somewhere', locals: { something: @some_instance_variable_for_the_partial }, layout: false) respond_to do |format| format.json { render json: { string_partial: html, success: true } } end end 元素并替换它。