通过form_for编辑自定义用户模型属性

时间:2015-09-18 16:06:11

标签: ruby-on-rails ruby-on-rails-4 devise

我目前正在尝试编辑我的用户列中的某个属性,该页面不是设计默认值,实际上是部分名为 _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

2 个答案:

答案 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| %>