尝试 POST 使用简单表单和 Rails 到数据库
Trying to POST to database with Simple Form and Rails
尝试将简单格式 gem 与 Rails 一起使用到 POST 我的数据库 (postgresql)。我关注了一些视频,但我不完全确定出了什么问题。在我将方法设置为 post 之前,我的表格有效(显然什么也没做)。
这是我得到的错误。
我马上就想到了路线问题。但是我已经有一段时间了,无法修复它。
undefined method `client_assets_path' for #<ActionView::Base:0x0000000000ccd8>
Did you mean? clients_new_path
这是我的 repo 如果对模型有帮助的话。
这是我的表格:
<%= simple_form_for @clients do |f| %>
<div class="form-inputs">
<%# Home %>
<%= f.input :ppor %>
<br>
</div>
<div class="form-actions">
<%= f.button :submit %>
</div>
<% end %
这是我在客户端控制器中的方法:
class ClientController < ApplicationController
def index
@clients = ClientAsset.all
end
def new
@clients = ClientAsset.new
end
def create
@clients = ClientAsset.new(client_asset_params)
if @clients.save
redirect_to @clients
else
render :new
end
end
private
def client_asset_params
params.require(:id).permit(:ppor)
end
end
这是我的路线:
Rails.application.routes.draw do
devise_for :admins
root to: "planner#index"
get "/index", to: "planner#index", as: :index
get "/howto", to: "planner#howto", as: :howto
get "/products", to: "planner#products", as: :products
get "/planners", to: "planner#planners", as: :planners
get "/admins/sign_in", to: "admin#sign_in", as: :sign_in
get "/admins/sign_up", to: "admin#sign_up", as: :sign_up
devise_scope :admin do
get "/admins/sign_out" => "devise/sessions#destroy"
end
get "/admins/password/edit", to: "devise/password#edit", as: :edit
get "/dashboard", to: "client#dashboard", as: :dashboard
get "clients/new", to: "client#new"
end
您认为路由有问题的直觉是正确的。
像您这样的表单上的 standard/default 行为是 POST 到指定资源的 'index path'(在您的情况下为 /clients
)。但是,您还没有定义 POST 路线。
您收到未定义方法错误而不是 'no route for' 错误的原因是 simple_form_for
假设您的路由具有 '[ 形式的 'named path helper' =39=]_path' 将为其提供适当的目标 URI。由于您没有定义路由,simple_form
找不到关联的方法,您会得到一个缺少方法的错误。
因此,您至少需要:
get "/clients/new", to: "client#new"
post "/clients", to: "client#create", as: 'client_assets'
as:
选项是必需的,因为默认情况下 Rails 使用资源路径名称 (clients
) 创建帮助程序,但 simple_form_for
假定该资源路径是派生的来自模型名称 (client_assets
).
顺便说一句,Rails 在您遵守惯例时效果最佳且最简单。如果您是 Rails 的新手,使用诸如 resourceful routing 之类的东西以及模型和控制器的命名约定(例如,ClientAsset
(模型)ClientAssetsController
(控制器))可以使您使用 Rails 的体验更加流畅。
您的一些事情可能会导致问题。您缺少指向控制器中创建方法的路由。 HTTP 动词应为 POST。但这可能无法解决您的问题。我会尽力帮助您指明正确的方向。
我在你的路线文件中注意到了一些东西,我想尝试帮助引导你走上 restful 道路。大多数 rails 开发人员会回避创建如下路线:
get "clients/new", to: "client#new"
Rails 太棒了,可以为您解决这个问题。我会删除它并将其添加到您的路线文件中:
resource :clients
这将自动提供所有需要的路线。索引、显示、新建、创建和销毁。
将其添加到路由文件后,运行 将其添加到 shell(来自项目目录)rails routes
你应该注意到你有我之前提到的所有路线。
我想指出的第二件事是你的控制器。控制器的 class 名称是复数形式。模型名称是单数。
class ClientController < ApplicationController
正常的 rails 惯例是:
class ClientsController < ApplicationController
我要指出的第三件事是:
def new
@clients = ClientAsset.new
end
看看你的回购协议,我可以告诉你这是不对的。您不应该在 Client
控制器中实例化 ClientAsset
实例。
在客户端控制器中,我希望看到如下内容:
def new
@client = Client.new
end
使用您在表单中使用的 @client
是行不通的,它将寻找完全不同的路由和控制器。
TBH,要吸收的东西太多了。如果你愿意,我可以在你的 repo 中发送 PR,如果你有兴趣,可以帮助你回到正轨。
尝试将简单格式 gem 与 Rails 一起使用到 POST 我的数据库 (postgresql)。我关注了一些视频,但我不完全确定出了什么问题。在我将方法设置为 post 之前,我的表格有效(显然什么也没做)。
这是我得到的错误。
我马上就想到了路线问题。但是我已经有一段时间了,无法修复它。
undefined method `client_assets_path' for #<ActionView::Base:0x0000000000ccd8>
Did you mean? clients_new_path
这是我的 repo 如果对模型有帮助的话。
这是我的表格:
<%= simple_form_for @clients do |f| %>
<div class="form-inputs">
<%# Home %>
<%= f.input :ppor %>
<br>
</div>
<div class="form-actions">
<%= f.button :submit %>
</div>
<% end %
这是我在客户端控制器中的方法:
class ClientController < ApplicationController
def index
@clients = ClientAsset.all
end
def new
@clients = ClientAsset.new
end
def create
@clients = ClientAsset.new(client_asset_params)
if @clients.save
redirect_to @clients
else
render :new
end
end
private
def client_asset_params
params.require(:id).permit(:ppor)
end
end
这是我的路线:
Rails.application.routes.draw do
devise_for :admins
root to: "planner#index"
get "/index", to: "planner#index", as: :index
get "/howto", to: "planner#howto", as: :howto
get "/products", to: "planner#products", as: :products
get "/planners", to: "planner#planners", as: :planners
get "/admins/sign_in", to: "admin#sign_in", as: :sign_in
get "/admins/sign_up", to: "admin#sign_up", as: :sign_up
devise_scope :admin do
get "/admins/sign_out" => "devise/sessions#destroy"
end
get "/admins/password/edit", to: "devise/password#edit", as: :edit
get "/dashboard", to: "client#dashboard", as: :dashboard
get "clients/new", to: "client#new"
end
您认为路由有问题的直觉是正确的。
像您这样的表单上的 standard/default 行为是 POST 到指定资源的 'index path'(在您的情况下为 /clients
)。但是,您还没有定义 POST 路线。
您收到未定义方法错误而不是 'no route for' 错误的原因是 simple_form_for
假设您的路由具有 '[ 形式的 'named path helper' =39=]_path' 将为其提供适当的目标 URI。由于您没有定义路由,simple_form
找不到关联的方法,您会得到一个缺少方法的错误。
因此,您至少需要:
get "/clients/new", to: "client#new"
post "/clients", to: "client#create", as: 'client_assets'
as:
选项是必需的,因为默认情况下 Rails 使用资源路径名称 (clients
) 创建帮助程序,但 simple_form_for
假定该资源路径是派生的来自模型名称 (client_assets
).
顺便说一句,Rails 在您遵守惯例时效果最佳且最简单。如果您是 Rails 的新手,使用诸如 resourceful routing 之类的东西以及模型和控制器的命名约定(例如,ClientAsset
(模型)ClientAssetsController
(控制器))可以使您使用 Rails 的体验更加流畅。
您的一些事情可能会导致问题。您缺少指向控制器中创建方法的路由。 HTTP 动词应为 POST。但这可能无法解决您的问题。我会尽力帮助您指明正确的方向。
我在你的路线文件中注意到了一些东西,我想尝试帮助引导你走上 restful 道路。大多数 rails 开发人员会回避创建如下路线:
get "clients/new", to: "client#new"
Rails 太棒了,可以为您解决这个问题。我会删除它并将其添加到您的路线文件中:
resource :clients
这将自动提供所有需要的路线。索引、显示、新建、创建和销毁。
将其添加到路由文件后,运行 将其添加到 shell(来自项目目录)rails routes
你应该注意到你有我之前提到的所有路线。
我想指出的第二件事是你的控制器。控制器的 class 名称是复数形式。模型名称是单数。
class ClientController < ApplicationController
正常的 rails 惯例是:
class ClientsController < ApplicationController
我要指出的第三件事是:
def new
@clients = ClientAsset.new
end
看看你的回购协议,我可以告诉你这是不对的。您不应该在 Client
控制器中实例化 ClientAsset
实例。
在客户端控制器中,我希望看到如下内容:
def new
@client = Client.new
end
使用您在表单中使用的 @client
是行不通的,它将寻找完全不同的路由和控制器。
TBH,要吸收的东西太多了。如果你愿意,我可以在你的 repo 中发送 PR,如果你有兴趣,可以帮助你回到正轨。