当前位置: 首页 > 知识库问答 >
问题:

Ruby on rails常见错误:缺少参数?

蒙麒
2023-03-14

我正在建立一个订单管理系统。我最近发布了一个关于向客户添加订单的问题。好像99%我都搞定了。如果我查看我的终端,它首先找到当前的客户ID,然后创建一个新订单。下面的结果是。

客户负载(0.2ms)选择“客户”。*从“客户”到“客户”。“id”=?限制1[[“id”,111]](0.1ms)开始事务SQL(0.4ms)插入“订单”(“customer_id”,“created_at”,“updated_at“)值(?,?,?)[[“customer_id”,111],[“created_at”,“2015-11-12 13:28:21.185604”],[”updated_at“,”2015-11-1213:28:21185604“]](8.2ms)提交事务

但问题是,它没有添加参数。我故意这样做只是为了检查我的语法是否会执行以下sql语句。但是一旦我添加参数,我就会收到一个常见错误“参数丢失或值为空:顺序”

这是我的代码:

def createorders
  @customer = Customer.find(params[:id]) #find current id??
  #current_user = Order.find(params[:id])
  @orders = @customer.orders.new(order_params)

  if @orders.save
    flash[:notice] = "Subject created successfully"
    redirect_to(:action => 'index')
  else
    #If save fails, redisplay the form so user can fix problems
    render('new') #het zit in de new.html template
  end
end

private 

  def order_params
    #same as using "params[:subject]", expect that it:
    # - raises an error if :subject is not present
    # - allows listed attributes to be mass-assigned
    params.require(:order).permit(:pakket, :verstuurt)
  end
end
<%= link_to("<< Back to List", {:action => 'index'}, :class => 'back-link') %>

<div class="subject new">
    <h2>Create Subject</h2>

    <%= form_for(:order, :url=> {:action => 'createorders'}) do |f| %>
    <table summary="subject form fields">
        <tr>
            <th>pakket</th>
            <td><%= f.text_field(:pakket) %></td>
        </tr>
        <tr>
            <th>verstuurt</th>
            <td><%= f.text_field(:verstuurt) %></td>
        </tr>

    </table>

    <div class="form-buttons">
        <%= submit_tag("Create Subject") %>
    </div>

    <% end %>
</div>

ActionController::P arameterMissing in OrderController#createorders param 缺失或值为空:order

Extracted source (around line #107):
105
106
107
108
109
110


  def order_params
  params.require(:order).permit(:pakket, :verstuurt)
      end
end

于2015-11-13 11:58:30 0100开始为:1获取“/order/createorders?id=111”OrderController#createorders作为HTML处理
参数:{“id”=

ActionController::ParameterMissing (param is missing or the value is empty: order):   app/controllers/order_controller.rb:107:in

order_params'app/控制器/order_controller.rb:44:在createorder'

  Rendered /Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/_source.erb

(8.3ms)渲染/Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/_trace.html。erb(2.6ms)渲染/Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html。erb(1.3ms)渲染的/Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/diagnostics.html。erb在救援/布局(68.2ms)中渲染/Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.2.1/lib/web_console/templates/_markup.html。erb(0.4ms)渲染/Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.2.1/lib/web_console/templates/_iner_console_markup.html。erb in layouts/inlined_string(0.4ms)Rendered/Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.2.1/lib/web_console/templates/prompt_box_markup.html。erb in layouts/inlined_string(0.4ms)Rendered/Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.2.1/lib/web_console/templates/style.css。erb in layouts/inlined_string(0.4ms)Rendered/Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.2.1/lib/web_console/templates/console.js中。erb在布局中/javascript(60.3ms)Rendered/Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.2.1/lib/web_console/templates/main.js。erb在布局中/javascript(0.3ms)Rendered/Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.2.1/lib/web_console/templates/error_page.js。erb在布局中/javascript(0.5ms)渲染/Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.2.1/lib/web_console/templates/index.html。erb(124.2毫秒)

感谢stackoverflow对我的支持。我是ruby的新手,我知道我犯了新手错误。所以欢迎指出缺陷!

共有1个答案

贝洲
2023-03-14

早些时候,当我专注于确定主要问题时,我忽略了你的次要、非致命问题,但现在主要问题很明显,我会把它们包括在内。

首先,我将稍微讨论一下Rails命名约定。您有两个模型,名为< code >客户和< code >订单。你用了名词的单数形式,这很好。模型的每个实例都是一样的,所以它应该是单一的。但是,您的< code>Order模型操作的控制器应该以复数形式命名,因此应该称为< code>OrdersController。这是因为它控制着与您所有订单相关的操作。这将我们引向您的< code>createorders操作,如果将其命名为< code>createorder,会更有意义一些,因为它只创建一个< code >订单。不过,实际上,约定是将该操作命名为< code>create。该操作在您的< code>OrdersController中,因此我们已经假设它处理一个< code>Order实例。(当您使用< code>resources函数让Rails自动为模型的控制器生成REST-ful路线时,它假设您有一个名为< code>create的操作。)最后,在< code>create方法中,将在视图中引用的新的< code>Order实例应该称为< code>@order,而不是< code>@orders,因为它只包含一个< code>Order。

现在事情变得有点复杂了。您的参数缺少错误正是意味着这一点。缺少新订单实例的参数。对产生该错误的服务器的请求是一个只有一个参数的 GET 请求,您在 URL 中提供的参数为 ?id=111。您的表单数据未通过该 GET 请求提交到服务器。您应该html" target="_blank">执行 POST 请求以创建新订单。我将避免进一步探索(以及在没有看到完整代码的情况下进行猜测)为什么现在无法正常工作,我只会建议一些关键的调整。在不看到所有部分的情况下弄清楚您的应用程序如何工作变成了一个难题。

在routes.rb中,你应该有这样一行:

resources :customers, :orders

我对您提供的视图进行了最小的更改,我假设它被称为show.html.erb并且位于您的app/view/客户文件夹中:

<%= link_to("<< Back to List", {:action => 'index'}, :class => 'back-link') %>
<div class="subject new">
    <h2>Create Subject</h2>
    <%= form_for @order do |f| %>
    <table summary="subject form fields">
        <tr>
            <th>pakket</th>
            <td><%= f.text_field(:pakket) %></td>
        </tr>
        <tr>
            <th>verstuurt</th>
            <td><%= f.text_field(:verstuurt) %></td>
        </tr>
    </table>
    <%= f.hidden_field :customer_id %>
    <div class="form-buttons">
        <%= submit_tag("Create Subject") %>
    </div>
    <% end %>
</div>

以下是 customers_controller.rb 支持它的必要代码:

def show
    customer = Customer.find params[:id]
    @order = customer.orders.new
end

请注意,在视图中,form_for 的参数是在控制器中创建的实例。此外,我还添加了一个隐藏字段,用于提交包含新订单数据的customer_id

最后,在orders_controller中创建操作。rb可能是这样的:

def create
  @order = Order.new(order_params)
  if @order.save
    flash[:notice] = "Subject created successfully"
    redirect_to(:action => 'index')
  else
    render 'customers/show'
  end
end

并且您的order_params方法应该更改为包含customer_id参数:

def order_params
  params.require(:order).permit(:pakket, :verstuurt, :customer_id)
end

请注意,在失败的save上,该操作将呈现customers/show,因为这是他们保存失败的页面。这将允许Rails使用提交失败时出现的数据重新填充表单(在相同的上下文中)。

 类似资料:
  • 在Spring Boot时发出请求并得到一个丢失的参数异常,尽管该值没有丢失。解决数独的项目 请求url为:http://localhost:8080/solvesudoku/getcellanswer/0/0 下面是错误消息: “错误”:“错误请求”, “异常”:“org.springframework.web.bind.MissingServletRequestParameterExcepti

  • 我得到了这个错误,我知道它的意思 DL已弃用,请使用Fiddle DL已被弃用,请使用Fiddle获取源索引从 rubygems.org/由于错误(2/3)而重试源获取: Bundler::Fetcher::CertificateFailureER ror无法验证<--的SSL 证书plhd--3/>您可能遇到中间人攻击,但最有可能的是您的系统没有验证所需的CA证书。有关 OpenSSL证书的信息

  • 错误 1 Error: Cannot find module 'gh-pages' at Function.Module._resolveFilename (module.js:489:15) at Function.Module._load (module.js:439:25) 上面的报错是:找不到 gh-pages 模块。 解决方法: npm i gh-pages

  • 我最近换了主持人。在这之后我看到了一个错误。我在Wordpress菜单中显示登录用户名时使用了一段代码来显示用户名,而不是“配置文件页”。它在上一台主机上运行正常。复制完所有内容和数据后,我在菜单栏上看到了这个错误。用户登录时会看到这一点。请提出补救办法。 下面是我的代码。这与我发布的stackoverflow链接上给出的完全相同。我创建了一个页面#profile_name#正如链接中提到的。

  • 我正在尝试使用他们的登录工具包从我的应用程序登录Snapchat。 此代码(我更改了clientId): 生成此url:https://accounts.snapchat.com/accounts/oauth2/auth?client_id=45fad898-162e-48e0-8e4e-135adbc42716 返回此错误:{“错误”:“无效的请求”,“错误描述”:“缺少PKCE参数”。} 注:

  • 问题内容: 嗨,我是Android编程的新手,我想问的问题可能很简单,但是我对如何使其工作一无所知,请多多包涵。 我从Android开发人员网站安装了android-sdk和相关工具。我按照他们的指示创建了HelloWorld应用,但出现了一些我不理解的错误。 文件MainActivity.java是一个自动生成的文件,在以下位置,我不断出现此文件错误: 因此,我尝试浏览生成的class文件中的l