RoR - 新的更新操作

Posted

技术标签:

【中文标题】RoR - 新的更新操作【英文标题】:RoR - New update action 【发布时间】:2014-10-21 17:45:32 【问题描述】:

我有两个模型

客户端.rb has_many :地址 接受嵌套属性:地址 地址.rb has_many :地址

我在ClientsController 上创建了一个新操作update_establishments,以便向客户添加新机构。

客户端控制器.rb #这个action对应的view会渲染locations_form def add_establishments @client = Client.find(params[:id]) @client.addresses.build 结尾 def update_establishments 创建_zip respond_to 做 |格式| 如果@client.update(client_params) set_zip format.html redirect_to @client,注意:'已添加。' format.json head :no_content 别的 format.html 渲染动作:'编辑' format.json 渲染 json:@client.error,状态::unprocessable_entity 结尾 结尾 结尾 位置表格 %= form_for @client, :url=>:action=>'update_establishments', html: :method =>"patch" 做 |form| %>

我有两个问题:

1 - 呈现表单时,表单会显示两个单独的地址字段,一个包含现有地址的值,另一个用于添加新地址。如何不显示现有地址?

2 - 它在update_establishments 操作上给出了一个明显的错误,因为@client 是零。有没有办法将客户端本身从表单发送到操作,还是我必须添加带有值的隐藏字段?

【问题讨论】:

【参考方案1】:

问题 1,当您调用 @client.addresses.build 时,它正在为客户端构建第三个地址。我的猜测是,您随后会在表单上显示所有三个地址。

问题 2,您需要将客户端 ID 与请求一起发送,并使用它来查找客户端。

以下应该可以解决这两个问题。

尽可能多地——而且几乎总是可能的——尝试坚持使用standard Rails controller actions。像add_establismentsupdate_establishments 这样的非标准控制器操作通常表明有一种更“Rails”的方式来为您的控制器建模。

在这种情况下,我会质疑为什么ClientsContoller 正在处理机构。如果您添加EstablishmentsController,我的猜测是一切都会开始工作。以下是如何做到这一点:

在 config/routes.rb 中,创建一个包含嵌套机构资源的客户端资源。

resources :clients do
  resources :establishments
end

这将为您提供一些nested routes,它们都以 /clients/:client_id/establishments 开头。

创建一个EstablishmentsController 并将add_establishmentsupdate_establishments 移动到它。将add_establishments 重命名为new 并将update_establishments 重命名为update。还将相应的视图移动到 /views/establishments/ 并重命名它们以匹配它们的新操作名称。

如果没有令人信服的理由在new 操作中找到客户,您可以只建立一个新机构以传递给视图。无论哪种方式,您的表单都将与这个新机构相关联,而不是与现有客户相关联。 (问题一)

update 中,您将使用:client_id 参数来查找客户端。 (问题 2)update 需要进行一些按摩,但我需要知道您是真的要同时更新多个场所还是只更新一个场所才能说出它的样子。 (您不会更新@client 本身,而是更新客户的机构。)

【讨论】:

我非常感谢您的回答,这让我想到了另一种构建模型的方法。然而,我有一个新的疑问,我希望你看看,如果你可以***.com/questions/25595309/…。感谢您的宝贵时间

以上是关于RoR - 新的更新操作的主要内容,如果未能解决你的问题,请参考以下文章

ruby RoR:创建选项操作

为新的RoR应用程序创建新的svn存储库

laragon环境更新安装新的php版本操作方法

RoR 和 json:按钮单击和更新计数不刷新

ASM ROR 是做啥的?

RoR:发送附加数据以使用 Jquery AJAX 提交