我目前有以下代码,它工作正常:
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不接受选项
我的 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) 我的 cart_controller 中有几个操作。我在 /carts 中有 2 个视图:payment.html.erb
和pay.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
如何,都会呈现。任何想法?return
respond_to
我知道 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。我不知道如何发送/接收此信息。我已经读过有关响应的内容,但我仍然不知道如何在这种情况下使用它。
使用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)
但不要觉得这是一种非常干燥的方法.