我目前正在尝试编辑我的用户列中的某个属性,该页面不是设计默认值,实际上是部分名为 _withdraw.html.erb 我不断收到错误:
#<#:0x007fd4297ab408>
的未定义方法`user_path'我不明白如何解决这个问题。
_withdraw.html.erb
# contents of the gist linked above - in case the link ever breaks
# If the requested filename exists, simply serve it.
# We only want to let Apache serve files and not directories.
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} !^/themes/stores/(.*)
RewriteCond %{REQUEST_URI} !^/themes/shop/(.*)
RewriteRule .? - [L]
# allow stores asset folder only
RewriteCond %{REQUEST_FILENAME} \.(gif|jpe?g|png|js|css|svg|svgz|eot|otf|woff|woff2|ttf|swf|php|ico|txt|pdf|xml)$
RewriteCond %{REQUEST_URI} ^/themes/stores/(.*)/asset/.*
RewriteRule .? - [L]
# allow shop asset folder only
RewriteCond %{REQUEST_FILENAME} \.(gif|jpe?g|png|js|css|svg|svgz|eot|otf|woff|woff2|ttf|swf|php|ico|txt|pdf|xml)$
RewriteCond %{REQUEST_URI} ^/themes/shop/(.*)/asset/.*
RewriteRule .? - [L]
任何帮助都会很精彩。提前谢谢
修改
的routes.rb
<%= form_for(@user) do |f| %>
<% if @user.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@user.errors.count, "error") %> prohibited this from being saved:</h2>
<ul>
<% @user.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="row">
<div class="col-md-12">
<div class="form-wrapper">
<div class="form-group">
<label for="paypal-email">Your Paypal Email Address</label>
<%= f.text_field :paypal %>
<p class="help-block">Example block-level help text here.</p>
<%= f.submit %>
</div>
</div>
</div>
</div>
<% end %>
balance_controller.rb
Rails.application.routes.draw do
devise_for :users
resources :offers
resources :categories, only: :show
root 'welcome#index'
get '/balance', to: 'balance#show', as: 'balance'
end
RAKE ROUTES
class BalanceController < ApplicationController
def show
@user = current_user
end
end
答案 0 :(得分:1)
form_for()
助手尝试从@user
变量创建路径并将其作为第二个参数传递。
根据您的路由添加到编辑操作的form_for
辅助对象第二个参数路径。
<%= form_for(@user, url: edit_user_registration_path) do |f| %>
来自form_for()
文档:
该方法可以以几种略微不同的方式使用,具体取决于 你希望多少依赖Rails自动推断出来 模型应该如何构建表单。
答案 1 :(得分:1)
要添加到其他答案,
你必须记住,调用部分意味着你必须对你将要从中访问的数据变量保持警惕。
换句话说,在部分内部调用@user
是不好的做法。您要么必须限制部分的使用,否定其使用 - IE是antipattern,或者每次加载应用时都必须定义@user
,这非常糟糕。
由于您正在使用Devise,因此有一些方法可以解决您的问题。
<强> current_user
强>
您需要考虑重构代码(不要依赖@user
部分代码)。此外,您需要确保在表单中使用正确的数据。
这是一个开始:
<%= form_for current_user, path: edit_user_registration_path, method: :put do |f| %>
<% if current_user.errors.any? %>
....
<% end %>
每次发送新请求时,Devise都会填充current_user
。这意味着您可以在此实例中使用current_user
代替@user
。
-
您还需要在form_for
帮助程序中定义自己的路径。
正如在另一个答案中所提到的,form_for
帮助器根据您传递的object
填充表单。通常,它使用RESTful路由模式来确定要定义的路径:
来自API:
表单要提交的网址。这可以在中表示 与传递给url_for或link_to的值相同。所以例如你 可以直接使用命名路线。当模型由a表示时 字符串或符号,如上例所示,如果:url选项不是 指定,默认情况下,表单将被发送回当前网址 (我们将在下面描述一种替代的面向资源的用法 form_for,其中不需要明确指定URL。
这意味着虽然您可能已经通过current_user
,但缺少真正的RESTful路由结构将阻止Rails正确填充表单代码。通常情况下,您拥有users/edit
路径,而Devise则缺少路径。
通过定义您自己的路径(使用edit_user_registration_path
方法的IE PUT
),您将能够访问所需的路径。
-
最后,您需要查看Devise的规定,允许您access Devise objects around your app。
具体做法是:
#app/helpers/application_helper.rb
class ApplicationHelper
def resource_name
:user
end
def resource
@resource ||= User.new
end
def devise_mapping
@devise_mapping ||= Devise.mappings[:user]
end
end
这样您就可以拨打<%= form_for resource_name, resource, :url => registration_path(resource_name) do |f| %>