0

私には非常に単純に思える問題がありますが、解決策がわかりません。ですから、何かお役に立てれば幸いです:-)

まず、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

静的ページ用のホーム コントローラーを作成しました。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

したがって、最後に行うことは、インスタンス変数 @current_user に新しい名前を与えるように HomeController を構成することです。ここに私の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

しかし、それはまったく機能しません。[OK] ボタンをクリックすると、ウィンドウが表示され、フィールドに入力し、送信ボタンをクリックすると、ユーザー ショー ビューに移動しますが、名前の変更は考慮されません。

私が何を間違えたのか分かりますか?

4

1 に答える 1

0

update メソッドで @current_user を定義しているようには見えません。

また、更新メソッドで params[:user] を取得しようとしているときに form_for(@user) を使用していますが、これは一貫性がありません。

私の意見では、更新する前に @current_user を定義するか (index で行うように params を使用)、devise *current_user* メソッドを直接使用する必要があります (ここには @ がないため、devise メソッドを呼び出していることに注意してください)。 、インスタンス変数ではありません)。

*current_user* を呼び出すと、クリックしたログイン ユーザーが更新されますが、find メソッドを使用すると、パラメーターに有効な ID が指定されている限り、他のユーザーを変更できることに注意してください。

于 2013-03-21T14:54:58.213 に答える