如何在相关模型视图之外使用表单?

时间:2013-03-17 08:33:37

标签: devise ruby-on-rails-3.2 form-submit

我有一个对我来说似乎很简单的问题,但我无法弄清楚解决方案。所以如果你能得到任何帮助,我会非常感激: - )

首先,我使用Devise gem创建我的用户。

这是 app / models / user.rb

class User < ActiveRecord::Base
  before_save :default_values
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :name, :email, :password, :password_confirmation, :remember_me, :avatar, :address, :longitude, :latitude

  has_many :products, dependent: :destroy

  has_attached_file :avatar, styles: { medium: "300x300>", thumb: "50x50>" },
                         url: "users/:id/:style/:basename.:extension",
                         path: ":rails_root/public/assets/users/:id/:style/:basename.:extension",
                         default_url: "users/missing/:style/missing.png"


  #Geokit
  geocoded_by :address
  after_validation :geocode, if: :address_changed?

  def default_values
    self.address ||= "Paris"
    self.geocode
  end

end

我为静态页面创建了一个Home控制器,我的root_path是 app / views / home / index.html.erb ,我们可以在其中找到:

<%= render 'new_name' %>

我们来看看 app / views / home / _new_name.html.erb

<!-- Button to trigger modal -->
<a href="#yourName" role="button" class="btn" data-toggle="modal">OK</a>

 <!-- Modal -->
<div id="yourName" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
  <div class="modal-header">
    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
    <h3 id="myModalLabel"><%= t('home.your_name') %></h3>
  </div>
  <div class="modal-body">
    <%= form_for(@current_user) do |f| %>
      <p>
        <%= f.label :name, t('name'), placeholder: t('home.your_name') %>
        <%= f.text_field :name %>
      </p>
      <p>
        <%= f.submit t('update'), class: "btn"%>
      </p>
     <% end %>
  </div>
</div>

是的,我绝对使用了靴子的魔法; - )

为了记录,我的 config / routes.rb

Dindon::Application.routes.draw do
  root to: "home#index"

  resources :products

  devise_for :users
  match 'users/:id' => 'users#show', :as => :user
  match 'users' => 'users#index'
end

所以,最后要做的是配置我的HomeController,为我的实例变量@current_user提供他的新名称。这是我的 app / controllers / home_controller.rb

class HomeController < ApplicationController
  def index
    @current_user = User.find_by_id(current_user.id)
  end

  def update
    @current_user.update_attributes(params[:user])
  end
end

但它根本不起作用。当我点击确定按钮,我有窗口,我填写字段,我点击提交按钮,它将我发送到用户显示视图,但没有在帐户中更改名称。

你知道我做错了什么吗?

1 个答案:

答案 0 :(得分:0)

看起来不像你在更新方法中定义@current_user。

你也使用form_for(@user),而你试图在你的更新方法中获得params [:user],这是不一致的。

在我看来,你应该在更新它之前定义@current_user(使用params,就像你在索引中那样),或者直接使用devise * current_user *方法(注意这里没有@,所以我们调用设计方法,而不是实例变量。)

请注意,调用* current_user *将更新单击的已记录用户,而使用find方法将允许您修改任何其他用户,只要参数中提供了有效的ID。

相关问题