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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从另一个方法ActionController :: UnknownFormat调用时,部分渲染不起作用相关的知识,希望对你有一定的参考价值。

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

  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中进行局部渲染。

答案

您的错误确实是ajax中的request类型与controller respond_to之间的不匹配。

你可以要求text/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

然后只需在前端挑选string_partial元素并替换它。

以上是关于从另一个方法ActionController :: UnknownFormat调用时,部分渲染不起作用的主要内容,如果未能解决你的问题,请参考以下文章

从Rails控制台调用ActionController方法

ActionController::TestCase 模拟 PayPal 购买

关于请求和响应:类ActionController::Base < Metal

ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):将 JSON 参数发布到

测试一个包含 ActionController::Live 的控制器

设计注册控制器的ActionController :: UrlGenerationError