【问题标题】:undefined method `user_verification_path' (has_one relationship)未定义的方法“user_verification_path”(has_one 关系)
【发布时间】:2016-06-17 17:57:12
【问题描述】:

我与verificationuser 有has_one 关系。我想制作一个引用两者的表格!我怎样才能做到这一点?我遇到了这个错误!!!谢谢!

错误日志:

ActionView::Template::Error (undefined method `user_verification_path' for #<#<Class:0x007fcb8bb4e8e0>:0x007fcb89e71998>):
    1: <%= form_for([@user, @user.verification]) do |f| %>
    2: 	<%= f.email_field :paypal_email, :class => 'form-control', :placeholder => "Paypal Email", id: 'Pemail' %>
    3: <%= f.text_field :paypal_firstname, :class => 'form-control', :placeholder => "Paypal FirstName", id: 'PfirstName' %>
    4: <%= f.text_field :paypal_lastname, :class => 'form-control', :placeholder => "Paypal LastName", id: 'PlastName' %>
  app/views/users/paypal_verification.html.erb:1:in `_app_views_users_paypal_verification_html_erb__139977708174630313_70256084327900'

这是我的表单 paypal html

<%= form_for([@user, @user.verification]) do |f| %>
	<%= f.email_field :paypal_email, :class => 'form-control', :placeholder => "Paypal Email", id: 'Pemail' %>
<%= f.text_field :paypal_firstname, :class => 'form-control', :placeholder => "Paypal FirstName", id: 'PfirstName' %>
<%= f.text_field :paypal_lastname, :class => 'form-control', :placeholder => "Paypal LastName", id: 'PlastName' %>


<%= f.submit "verify", class: "btn btn-primary" %>
<% end %>

这是我的控制器!!!

def paypal_verification
    # @verification = @user.verification.new
    @user = current_user
@verification = Verification.create(params[:verification])
@user.verification = @verification
end

Routes.rb

 devise_for :users ,
       :path => '' ,
       :path_names => {:sign_in => 'login', :sign_out => 'logout', :edit => 'profile'},
       :controllers => {:omniauth_callbacks => 'omniauth_callbacks',
                :registrations => 'registrations', :verifications => 'verifications'
              }


 resources :users, only: [:index, :show] do

 end
 resources :revisers
 resources :photos
 resources :pages

 #make sure to change this to user!!! instead of reservations!!!
resources :reviser do
  resources :reservations, only: [:create]
end


resources :user do
  resources :verifications, only: [:create]
end


get '/preload' => 'reservations#preload'
get '/preview' => 'reservations#preview'

get '/your_essays' => 'reservations#your_essays'
get '/your_reservations' => 'reservations#your_reservations'

post '/notify' => 'reservations#notify'
post '/your_essays' => 'reservations#your_essays'

get '/users/:id/paypal_verification' => 'users#paypal_verification'

【问题讨论】:

  • 你能发布你的路线文件吗?您是否有别名发布路线::user_verification?
  • 我进行了编辑!!谢谢米尔扎!!
  • 我更改了资源 :user 做资源 :verification, only: [:create] end 现在我收到这个错误 No route matches [PATCH] "/user/3/verification.27"
  • 看看我下面的答案...如果您正在执行 PATCH,那么您的表单需要说...form_for(@user.verification, url: user_verifications_path(@user, @user.verification) ....您需要在表单后传入 url,然后查看您为此表单设置的 bin/rails 路由别名

标签: html ruby-on-rails ruby forms controller


【解决方案1】:

因为你正在做一个嵌套路由来做验证 rails 会期望这个路由:

 Prefix Verb   URI Pattern                            Controller#Action
 user_verifications POST   /user/:user_id/verifications(.:format) verifications#create

您可以检查 bin/rails 路线

所以在你的表单中你需要使用 user_verifications_path 但是因为你有实例变量这里是你需要做的

<%= form_for([@user, @user.verification]) do |f| %>

那一行应该这样说

<%= form_for(Verification.new, url: user_verifications_path(@user)) do |f| %>

Uer 验证将转到 /users/ID/verifications,其中 Verifications.new 作为您传递给控制器​​的新模型。这应该在验证#create 中。您尚未在问题中包含此控制器。因此,如果这不起作用,请也使用此方法更新您的问题。

编辑

如果您想更新已创建的验证,则为 PATH/ 或将唯一更改的是记录和路径的实例,因此它转到 /users/ID/verifications/VERIFICATIONID

你的表单需要这样写

form_for(@user.verification, url: user_verifications_path(@user, @user.verification)

希望对你有帮助

【讨论】:

  • 使用 ngrok 它从用户 4 更改为用户 3... 很奇怪,但使用本地主机很好!现在通过了,我只是在下一页有一个与这个问题无关的错误,但你可能会回答它,所以我会再问一个问题!谢谢!!
  • 我注意到我的数据库每次在提交前加载页面时都会创建一个新的验证。不应该住同一个人吗?
  • 我认为是因为@verification = Verification.create(params[:verification]) 这一行。此方法是 get def paypal_verification 所以我假设您希望在用户验证帐户之前准备表格。在获取中,您应该只执行@verification = Verification.new,然后在提交验证时创建内部表单。不确定您是否还需要验证用户是否已经过验证。在这种情况下,您可以执行 before_action 并使用 flash 消息重定向,说您已经通过验证...等
  • 是的!我想到了!!哈哈我一直在熬夜工作,所以我有时会想念这些东西!!非常感谢!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多