在我的应用程序中,我有一个"用户"模型.每个用户可以拥有多个(电子邮件)地址,这些地址在"地址"模型中定义:
Class User < ActiveRecord::Base
has_many :addresses
def is_authorized(op)
# returns true or false
end
def is_owned_by(user)
# returns true or false
end
end
Class Address < ActiveRecord::Base
belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)
在AddressController类中,当前登录的用户可在"@user"实例变量中使用.控制器阻止普通用户编辑,删除,查看等不属于他们的地址 - 但他允许管理用户编辑这些地址.如果当前登录的用户正在执行正常或超级用户操作,则AddressController类可以询问AddressModel.
这一切都运行良好,数据库更新按预期进行,但是,我真的希望根据操作模式使用不同的HTML视图.我只能想到两种方法来实现这一目标:
如果可以在两个完全不同的布局中显示执行单个控制器的结果,根据它的操作模式,有什么好的方法可以实现呢?
在此先感谢Stefan
我正在开发一个Rails 2.3.1网站.在整个网站上,我需要有一个表格,用于在各种页面上创建帖子(主页,创建帖子页面,帖子列表页面,评论列表页面等等) - 足以说明这个表格需要在许多页面上提供服务.各种控制器).这些页面中的每一个都显示在相应的控制器/动作中检索的各种其他信息.例如,主页列出了最新的10个帖子,从数据库中提取的内容等.
所以,我已经将Post创建表单移动到它自己的partial中,并将其部分包含在所有必需的页面上.请注意,Partial POSTs中的表单为/ questions(路由到PostsController :: create - 这是默认的rails行为).
我遇到的问题是当Posts表单没有正确完成时,默认情况下PostsController :: create方法呈现的问题/ new.html.erb,即使表单是从主页(/ home/index)提交的. html.erb).
我尝试更改部分中的表单以提交"submitting_controller"和"submitting_action",并在PostsController :: create中,当@ post.save?== false,我渲染动作=>"../submitting_controller/submitting_action"(这有点hacky,但允许你从非PostsController渲染动作).
这似乎在表面上可行.不完整的表单在视图中呈现,提交了所有正确的@ post.errors消息等.问题是页面上的所有其他数据都没有显示,因为实际的submitting_controller/submitting_action方法没有被调用,只是相关的观点.(记住,我做了一个保留实例对象的渲染,而不是一个不保留@post实例对象的redirect_to,该对象具有所有错误消息和提交的值.)
据我所知,我有两个选择:
1)@ post.save时,我可以在会话中存储@post对象吗?在PostsController :: create,redirect_to submitting_controller/submitting_action中失败,此时我将@post对象拉出会话并使用它来重新填充表单/错误消息.(据我所知,在会话中存储对象是在rails中的BAD练习)
2)我可以移动所有用于从各种submitting_controller/submitting_action中提取非post创建表单数据的逻辑,将它放在ApplicationController中,在PostsController中创建一个巨大的switch语句:: create for submitting_controller/submitting_action并调用方法中的方法ApplicationController用于获取每个提交页面渲染所需的所有额外数据.
关于在Rails中做到这一点的最佳方法的想法?
我有一个用于控制器配置的DSL.底层功能依赖于before_filters.为了防止多次设置before_filter,我真的需要找出是否已经在Rails 3控制器中设置了before_filter.由于before_filter的工作与类变量(继承,类重新加载)不同,我不能只设置要检查的类变量.
深入研究AbstractController回调的新高度抽象代码并没有给出任何关于这是否可行的线索.
我是否真的需要为控制器中的每个DSL呼叫调用skip_filter?
我一直在看这个,现在我不知所措.我已经将问题缩小到与JSON相关,并且JSON似乎没有以清晰的格式发送.
我们之前使用的是Rails 3.0.7(我将要描述的问题不存在).我们需要升级Rails以利用一些新功能 - 但现在存在这个问题.我几乎可以肯定这是一个简单的配置或者什么,但是我需要更多关注它.
我们正在使用ActiveResource对象,在设置对象的值并保存它(从而产生PUT)时,我们得到ab 403:从远程Web服务返回Forbidden.这不是Web服务层的问题.
在创建一个新对象并进行POST时,我们得到一个409:在尝试使用默认值更新数据库时返回冲突 - 这意味着json数据未到达服务 - 或者不清晰.
我的问题是这在Rails 3.0.7中有效,并且不再适用于3.2.3(或我也尝试过的3.1.3).我对JSON数据以外的建议持开放态度,但我很确定这就是问题所在.
我的ActiveResource模型有
self.format = :json
Run Code Online (Sandbox Code Playgroud)
我在其中一个初始化文件中有以下内容:
ActiveResource::Base.include_root_in_json = false
ActiveSupport::JSON.backend = "json_gem"
Run Code Online (Sandbox Code Playgroud)
谢谢你的任何建议!
UPDATE
我一直在测试curl并通过以下方式开始工作:
curl -H "Content-Type: application/json" -d "{\"userID\":\"xxx\", \"label\":\"doc.test.test\", \"value\":\"1,19\", \"id\":\"-1\"}" -v -X POST http://host:port/usermanagement/users/xxx/prefs
Run Code Online (Sandbox Code Playgroud)
我得到了它的工作,但是
似乎必须显式设置Content-Type标头,否则会导致415:Media Unrecognized错误
如果我在ActiveResource对象中设置Content-Type标头,我仍然会得到409:Conflict错误 - 这让我相信JSON仍未正确形成.
编辑(再次)
我已经弄清楚JSON的问题在哪里--Rails在JSON中保留了根.因此,而不是将资源作为
{"name":"value", "name":"value"}
Run Code Online (Sandbox Code Playgroud)
它正在发送
{"ResourceName": {"name":"value", "name":"value"}}
Run Code Online (Sandbox Code Playgroud)
但是,我设置include_root_in_json为false - 我在初始化文件中尝试了这一点,并且直接在模型本身中尝试了这一点,并且没有任何更改.
我的模型中的函数几乎都有"共享"语句.问题是我得到以下错误,当我需要在我的控制器中使用多个这些函数时:
控制器操作应该调用除初始查找或新查询之外的一种模型方法
并且IDE更深入地解释:
如果控制器操作在初始.find或.new之后包含多个模型方法调用,则此检查会发出警告.建议您在模型类中实现所有业务逻辑,并使用单个方法来访问它.
这是否意味着所有逻辑都应该放在更复杂的模型函数中?我认为控制器的工作是调用模型函数并将结果传递给视图.
如果我将模型函数代码放回控制器,一切都会工作,但我会在所有控制器操作中得到代码重复.
那么,这里的正确方法是什么?
我有以下设置:
uploads_controller.rb:
class UploadsController < ApplicationController
before_action :set_upload, only: [:show, :edit, :update, :destroy]
# GET /uploads
def index
@uploads = Upload.all
update_file_status
@uploads = Upload.all
end
# GET /uploads/1
def show
end
# GET /uploads/new
def new
puts "Running uploads/new"
@upload = Upload.new()
end
# GET /uploads/1/edit
def edit
end
# POST /uploads
def create
@upload = Upload.new(upload_params)
if @upload.save
@upload.update!(:status => "1")
@upload.update!(:f_path => "#{@upload.sourcedata.path}")
redirect_to uploads_url, notice: "Upload for #{@upload.task.name} was successfully created with file #{@upload.sourcedata_file_name}."
else
redirect_to …Run Code Online (Sandbox Code Playgroud) javascript ajax ruby-on-rails unobtrusive-javascript actioncontroller
我知道默认情况下Rails选择javascript文件取决于要呈现的操作名称:
例如,如果我有
def create
#Code and Stuff happening here
end
Run Code Online (Sandbox Code Playgroud)
我在这里
create.js.erb
Run Code Online (Sandbox Code Playgroud)
这将默认运行
但有没有办法可以从动作中选择一个不同的javascript文件?
例如
create1.js.erb
create2.js.erb
Run Code Online (Sandbox Code Playgroud) 你可以用thin与ActionController::Live实现服务器端的事件(SSE)和长轮询?如果是这样,怎么样?
虽然标题是如何获取Rails 4 ActionController :: Live流与Thin和Ruby 2一起使用的重复?Thin和Puma如何通过直播流扩展?OP通过提出两个问题来混淆水域,这个问题从未得到回答.
thin如果你通过exec thin start --threaded以下方式启动它,许多其他帖子建议你可以用于服务器端事件(sse):Heroku是否支持ActionController :: Live?和Puma只有多线程导轨4 http服务器?,Aaron的开创性建筑http://tenderlovemaking.com/2012/07/30/is-it-live.html和Ryan常年可靠的http://railscasts.com/episodes/401-actioncontroller-live?view=asciicast.但即使我正在复制Railscast示例,我也无法使用它thin.
# ----------------------------------------------------------------
# file: config/routes.rb
Rails.application.routes.draw do
resources :widgets do
collection do
get 'events' # SSE test
end
end
end
Run Code Online (Sandbox Code Playgroud)
_
# ----------------------------------------------------------------
# file: config/environments/development.rb
Rails.application.configure do
... snip ...
# see http://tenderlovemaking.com/2012/07/30/is-it-live.html
config.preload_frameworks = true
config.allow_concurrency = true
end …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用...
params.require(:subscriber).permit(:utm_source, :utm_medium, :utm_campaign, :utm_term, :utm_content)
Run Code Online (Sandbox Code Playgroud)
问题是在极少数情况下我想做:
Subscriber.new(subscriber_params)
我不在乎所有的值是否都是空的......当我这样做时它会引发ActionController::ParameterMissing
所以我需要的是一种使require()“可选”成为“可选”的方法,但仍然使用它来限制嵌套参数和安全性,这样人们就无法添加{admin: true}诸如此类的东西......
实际的 params 哈希看起来像:
{subscriber: {utm_source: 1, ...}
我无法更改该部分,因为它已在应用程序的许多其他地方使用。就这一点而已。
parameters ruby-on-rails actioncontroller strong-parameters ruby-on-rails-5
我正在尝试以设定的时间间隔将数据写入流。
class StreamController < ApplicationController
include ActionController::Live
def stream
response.headers['Content-Type'] = 'text/event-stream'
5.times do
response.stream.write "data: hello world\n\n"
sleep 1
end
ensure
response.stream.close
end
end
Run Code Online (Sandbox Code Playgroud)
但是,当我向 /stream 端点发送 get 请求(使用curl)时,我得到:“data: hello world\n\n” 5 秒后一次性发送 5 次,而不是接收“data: hello world\n\n” “每秒一次。我使用的是 Rails 7.0.4 附带的默认 puma Web 服务器。我的猜测是它会缓冲响应,然后在调用response.stream.close时发送它。
我尝试添加options = { flush_headers: true }到 puma 配置文件,但没有帮助。
actioncontroller ×10
ruby ×4
ajax ×2
actionview ×1
forms ×1
javascript ×1
json ×1
parameters ×1
streaming ×1
thin ×1