【问题标题】:undefined method `model_path' for #<#<Class:> UPDATE method#<#<Class:> UPDATE 方法的未定义方法 `model_path'
【发布时间】:2016-12-03 02:16:48
【问题描述】:

我收到此错误:

undefined method `invite_path' for #<#<Class:0x9396d38>:0x8f8fb30>

我的控制器

class ConfirmationsController < ApplicationController
  skip_before_action :verify_authenticity_token

  def index
    @confirmation = Invite.joins(:user).select('invites.horario_desde, invites.horario_hasta, invites.estado, users.email, users.nombre, users.apellido, users.telefono, invites.complejo')
      .where(:hash_id => filter_params[:hash_id],:user_id => filter_params[:user_id]).first
  end

(它只得到一条记录)

我的路线

  get '/confirmations' => 'confirmations#index'
  post '/confirmations' => 'confirmations#update'

我的看法

<%= form_for @confirmation do |confirmation|%>
  <p>Horario: de <%= confirmation.horario_desde %> a <%= confirmation.horario_hasta %></p>
  <p>Email: <%= confirmation.email %></p>
  <p>Teléfono: <%= confirmation.telefono %></p>

  <%=f.submit 'Confirm'%>
  <%=f.submit 'Cancel'%>
<%end%>

我们的想法是显示来自我的控制器 (@confirmations) 的一些数据,如果用户点击“确认”,则应该更新我的模型具有特定状态。但我什至无法使这个表单工作。

还有其他更好的方法吗?

谢谢

【问题讨论】:

  • 使用select 过于具体通常是个坏主意,使用includes 加入关联模型更安全。我认为您的非标准模型实例令人困惑form_for

标签: ruby-on-rails ruby forms form-for


【解决方案1】:

出现错误是因为表单操作使用来自控制器的@confirmation 对象。你可以使用Resource-oriented style

尝试在您的项目目录中运行rake routes,您可以看到每条路线的一些别名。

示例:

confirmations    GET        /confirmations(.:format)          confirmations#index
confirmations    POST        /confirmations(.:format)          confirmations#update

对表单操作使用别名路径,类似这样

<%= form_for @confirmation, url: confirmations_path(@confirmation) do |confirmation|%>
  <%# .... another stuff here ... %>
<% end %>

注意:confirmations_path 只是一个例子。

【讨论】:

  • 不工作:(现在我在尝试读取#<:helpers::formbuilder:0x5658f00> 的@confirmation 属性> 未定义方法“字段”时遇到错误。我知道这一点对象里面有东西。如果拿走它的工作形式..
  • @EzequielRamiro 在你的表单中有这个问题,但我在你的表单中看不到 field 方法
  • 将其设置为confirmations_path(nil) 是否安全?在我的情况下,它只是一个电子邮件联系表,现在显示或索引需要。
【解决方案2】:

我最近遇到了这个问题。您的问题是您正在使用invite 路径的表单进行发布操作。由于没有处理该问题的路线,因此您遇到了错误。

有两种方法可以解决这个问题:

  1. 在路由中添加路径。

    post 'invite', to: 'invite#create'

  2. 将资源添加到路由中的invite

    resources :invite

这将为new, edit, update, show, destroy 创建处理程序。如果你想 任何特定的操作,然后尝试像

  `resources :invite, except: [:update]`

希望对你有帮助:)

【讨论】:

    猜你喜欢
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 2020-05-30
    • 1970-01-01
    • 2016-05-19
    • 2018-04-02
    • 2014-04-28
    相关资源
    最近更新 更多