标签: respond-to

将一个局部变量添加到respond_to渲染视图中

我目前有以下代码,它工作正常:

respond_to do |format|
  format.json { render :show, status: :ok }
end
Run Code Online (Sandbox Code Playgroud)

我相信:show是指jbuilder视图.

但是,如果我想在json渲染中添加局部变量,我该怎么做?

我尝试过以下但是没有用.

auth = true
format.json { render :show, :include => auth, status: :ok }
Run Code Online (Sandbox Code Playgroud)

而我也试过了

auth = true
format.json { render :show.include(auth), status: ok }
Run Code Online (Sandbox Code Playgroud)

从我在渲染中发现:json不接受选项

ruby-on-rails respond-to

3
推荐指数
1
解决办法
881
查看次数

Rails respond_to 重定向不起作用

我的 Rails 应用程序中的 create 控制器中的 respond_to 块没有在成功保存时重定向...我确定这是一个简单的解决方案,但我对 Rails 缺乏经验,这是我第一次遇到这个问题。

表单设置为:remote => true,控制器如下...

def create
    @store = current_user.stores.new(store_params)

    respond_to do |format|
        if @store.save
            format.html { redirect_to root_path }
        else
            format.html { flash[:alert] = "Save failed! #{@store.errors.full_messages.join(";")}" 
            render "new" }
            format.js {}
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

当我谈到这个主题时,条件的else部分的代码也不会运行,除了format.js {},它确实运行了我的 create.js.erb 文件中的代码(暂时是一个警报)。

我正在使用 Rails 4.2.5。有人可以帮助我理解为什么重定向和警报不起作用吗?谢谢!

编辑以显示解决方案 根据 Rich 的回答,这是我提出的解决方案:

控制器:

def create
    @store = current_user.stores.new(store_params)

    flash.now[:alert] = "Save failed! #{@store.errors.full_messages.join(";")}" unless @store.save

    respond_to do |format|
        format.js
    end

    if @store.save
        flash[:notice] = …
Run Code Online (Sandbox Code Playgroud)

ajax ruby-on-rails respond-to

3
推荐指数
1
解决办法
3793
查看次数

Rails respond_to 不会阻止代码进一步执行

我的 cart_controller 中有几个操作。我在 /carts 中有 2 个视图:payment.html.erbpay.html.erb

def pay
   success = #do something that returns true or false
   if success
     respond_to do |format|
       format.html { redirect_to '/cart/checkout/review'}
     end
   else
     render_errors
   end
end

def render_errors
  respond_to do |format|
    format.html { render 'payment'}
  end
end
Run Code Online (Sandbox Code Playgroud)

我期望的是当

success == false
Run Code Online (Sandbox Code Playgroud)

它命中 render_errors 并渲染payment view然后停止。然而它正在做的是:它渲染然后它也payment view渲染。pay view所以payment view从未显示过。我做错了什么?我在 Rails 4.0 上使用 Ruby 2.0。

更新:我发现每当我这样做时,@cart.errors.add(:name, 'error message')无论任何or语句pay view如何,都会呈现。任何想法?returnrespond_to

ruby ruby-on-rails respond-to

2
推荐指数
1
解决办法
2079
查看次数

Rails中如何响应ajax调用

我知道 stackoverflow 上已经有很多关于此问题的问题,但没有一个对我有用。这是我的ajax代码:

function update_schedule($task){
  var taskId = $task.data("taskId"),
    startHour, endHour,
    userId = $('#users').val();
  if( !$task.hasClass('daily-task')){ 
    startHour = getStartHour($task),
    endHour = startHour + (+$task.data('time'));
  }
  console.log(startHour, endHour)

   $.ajax({
          url: '/heimdall/update_scheduled_task',
          method: 'POST',
          data: { "task_id": taskId, "start_hour": startHour, "end_hour": endHour, "user_id": userId },
          success: function (){
            console.log("SUCESS!!", data['head'])
          },
          error: function () {
              console.log("FAILURE");
          },
          async: true
    }); 
}
Run Code Online (Sandbox Code Playgroud)

控制器代码:

def update_scheduled_task
    scheduled_task = ScheduledTask.find_or_create_by(task_id: params[:task_id])
    scheduled_task.update_attributes(start_hour: params[:start_hour], end_hour: params[:end_hour], task_id: params[:task_id], user_id: params[:user_id])

  end
Run Code Online (Sandbox Code Playgroud)

我想返回找到或创建的任务的ID。我不知道如何发送/接收此信息。我已经读过有关响应的内容,但我仍然不知道如何在这种情况下使用它。

ajax ruby-on-rails respond-to

2
推荐指数
1
解决办法
7497
查看次数

覆盖to_xml以限制返回的字段

使用ruby 1.9.2和rails 3,我想限制以json或xml访问记录时返回的字段(只允许两种格式).

这个非常有用的帖子向我介绍了respond_with,我在网上找到了一条毯子允许/拒绝某些字段的好方法是覆盖类的as_json或to_xml并设置:only或:除限制字段外.

例:

class Widget <  ActiveRecord::Base
  def as_json(options={})
    super(:except => [:created_at, :updated_at])
  end

  def to_xml(options={})
    super(:except => [:created_at, :updated_at])
  end
end

class WidgetsController < ApplicationController
  respond_to :json, :xml

  def index
    respond_with(@widgets = Widgets.all)
  end

  def show
    respond_with(@widget = Widget.find(params[:id]))
  end
end
Run Code Online (Sandbox Code Playgroud)

这正是我正在寻找的并适用于json,但对于xml"index"(GET /widgets.xml),它以空的Widget数组进行响应.如果我删除to_xml覆盖我得到预期的结果.我做错了什么,和/或为什么Widgets.to_xml覆盖会影响Array.to_xml结果?

我可以通过使用来解决这个问题

respond_with(@widgets = Widgets.all, :except => [:created_at, :updated_at])
Run Code Online (Sandbox Code Playgroud)

但不要觉得这是一种非常干燥的方法.

respond-to respond-with ruby-on-rails-3

1
推荐指数
1
解决办法
2135
查看次数