是否可以从非 REST 部分形式组合 REST 和非 REST 操作和资源?

Posted

技术标签:

【中文标题】是否可以从非 REST 部分形式组合 REST 和非 REST 操作和资源?【英文标题】:Is it possible to combine REST and Non REST actions and resources from a Non REST partial form? 【发布时间】:2012-04-07 12:48:41 【问题描述】:

我需要一个来自我创建的脚手架生成表的单独索引/视图。在这个视图中,我有大约一半的原始脚手架列,目的是让用户能够编辑和更新其中的两个。我创建了一个非脚手架控制器来生成这个视图。所以,我的问题:

1)。是否可以以非脚手架部分形式组合脚手架和非脚手架资源?

2)。我可以使用非脚手架控制器的编辑操作和部分更新到脚手架表吗? 我想在生产中,这可能是某种授权系统?但现在,我只想找出可能性。我在非脚手架控制器中的视图/索引有效,但编辑按钮当然什么也不做。我错过了什么吗?目前,我在 Windows 7 上使用 Rails 3.0,如果这有什么不同的话。

部分路由:

<%= form_tag(:controller=> "ravs", :method=> "get", :action=> "edit", :class=>    "_dec") %>

    <div >
    <%= submit_tag(:controller=> "achvrs", :method=> "put", :action=> "update") %>
    </div>
    <% end %>

这是我的路线.rb:

    Effcnt::Application.routes.draw do
    get "ravs/index"
    get "ravs/edit"
    get "ravs/_dec"
    resources :achvrs

这是我的非脚手架控制器中的编辑操作:

    def edit
    @achvr = Achvr.find(params[:id])
    end

【问题讨论】:

我没有仔细看,但我认为您永远不会想将部分呈现为独立页面。部分应该只是一种可重用的视图“功能”。让 Rails 完成组装页面的工作(从布局开始,然后是特定视图及其任何部分,或他们的)。 【参考方案1】:

我认为您的代码不起作用。因为根据 rails API(从 rails2.3.x 到 3.2),“submit_tag”没有您提供的选项(

<%= submit_tag(:controller=> "achvrs", :method=> "put", :action=> "update") %>

),这个标签支持的是:

:confirm => 'question?' - This will add a javascript confirm prompt with the question specified. If the user accepts, the form is processed normally, otherwise no action is taken.
:disabled - If true, the user will not be able to use this input.
:disable_with - Value of this parameter will be used as the value for a disabled version of the submit button when the form is submitted.
Any other key creates standard html options for the tag.

而且,我认为您的实现代码没有意义,一个表单只能提交给 1 个目标 (some_controller#some_action),但是您似乎想一次将一个表单提交给 2 个操作?

所以,我认为您最好以 Rails 的 MVC 方式编写代码:将要运行的代码组合成 1 个动作,例如:

def the_action_your_form_submitted_to 
    # previously it was called in your RESTful action 
    do_task_no.1   
    # previously it was called in your non-RESTful action
    do_task_no.2   
end

【讨论】:

【参考方案2】:

如果我理解正确,您希望能够在 1 个视图中编辑一条记录的 2 列。

功能是这样的吗?:

    您访问ravs#index ravs#index 列出所有 Achvr 记录 您点击这些记录之一的编辑 您被发送到ravs#edit:id 与记录匹配 在此视图中,您可以更新:col1:col2 的值 您点击提交按钮,将您发送至achvrs#update

ravs#edit 的视图中,您可以拥有这个。像这样使用form_for 应该可以工作,因为@achvrAchvr 模型的一个实例。然后它会指向它自己的控制器。

    <%= form_for(@achvr, :html => :class => '_dec') do |f| %>
      <%= f.text_field :col1 %>
      <%= f.text_field :col2 %>
      <%= f.submit %>
    <% end %>

在您的achvrs#update 操作中,您可以检查params 哈希的值。然而,脚手架更新方法应该正确更新内容。当您从 ravs#edit 更新时,params 将仅保存 :col1:col2 的值

最后一句话!这不是执行此操作的正确方法。您可能希望拥有一个具有权限的用户模型。然后根据这些过滤哪些值可以编辑。

【讨论】:

非常感谢您的回复。是的,我的意图是正确的,我认为在生产环境中这将基于模型和权限。会及时查找并发布。再次感谢。

以上是关于是否可以从非 REST 部分形式组合 REST 和非 REST 操作和资源?的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL 是不是具有与 REST 相同的缓存能力

什么是REST API

Django REST framework 基本组件

rest_framework

REST和RESTFUL

组合键资源 REST 服务