尝试 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,如果你有兴趣,可以帮助你回到正轨。