Обновление записи - Ruby On Rails 3.1 - PullRequest
0 голосов
/ 19 января 2012

Я новичок на рубине на рельсах. У меня есть модель пользователя с этими атрибутами: логин, электронная почта, роль и группа.

Вот мой файл /app/models/user.rb

# == Schema Information
#
# Table name: users
#
#  id         :integer         not null, primary key
#  login      :string(255)
#  email      :string(255)
#  role       :integer
#  group      :integer
#  created_at :datetime
#  updated_at :datetime
#

class User < ActiveRecord::Base
    attr_accessible :login, :email, :role, :group

        def self.search(search)
        if search
            where('login LIKE ?', "%#{search}%")
            else
            scoped
        end
    end
end

Здесь мое приложение / views / users / edit.html.erb

<%= form_for(@user) do |f| %>
  <div class="field">
    <%= f.label :login %><br />
    <%= f.text_field :login, :readonly => true%>
    </br>
    <%= f.collection_select(:role, Role.all, :id, :name)
 %>
  </div>
  <div class="actions">
    <%= f.submit "Update" %>
  </div>
<% end %>

Когда я нажимаю кнопку Обновить, я перехожу на страницу показа пользователя. У меня есть этот след:

Started PUT "/users/4"
  processing by UsersController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"HBB9IcKpWyjSbrmh6os=", "user"=>{"role"=>"3"}, "commit"=>"Update", "id"=>"4"}
Redirected to http%3A%2F%2F10.100.2.66%3A3000%2Fusers%2F4
Completed 302 Found in 1ms

Вот мое приложение / controllers / users_controller.rb

class UsersController < ApplicationController
     before_filter :require_admin
     helper_method :sort_column, :sort_direction


  def new
    @title = "Sign up"
  end

  def show
    @user = User.find(params[:id])
    @title = "User"

  end

  def edit
    @title = "Edit User"
    @user = User.find(params[:id])
  end

  def index
    @users = User.search(params[:search]).order(sort_column + " " + sort_direction).paginate(:page => params[:page],:per_page => 10)

  end

  def update
     @user = User.find(params[:id])

     if @user.update_attributes(params[:user])
        flash[:success] = "Profile updated."
        redirect_to @user
     else
        @title = "Edit user"
        render 'edit'
     end

  end

  def get
    @user = User.find(params[:login])
  end

Я не понимаю, почему это не работает. Если в индексе я принудительно обновляю пользователя таким образом, он работает:

def index
  @testUser = User.find(6)
  @test.user.update_attributes(:role => "2")
  ...
end

Это похоже на то, что инструкции в обновлении не выполняются. Если я сделаю:

def update
  logger.info("i am in update)
   ...
end

У меня нет журнала

вот результат команды rake routs:

Надеюсь, мне было ясно. Извините за мой английский, он очень плохой.

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 08 апреля 2013

Возможно, это из-за неправильной переменной:

def index
  @testUser = User.find(6)
  @test.user.update_attributes(:role => "2")
  ...
end

должно быть:

def index
  @testUser = User.find(6)
  @testUser.update_attributes(:role => "2")
  ...
end

Или, может быть, вы можете это:

@testUser = User.find(6)
@testUser.role = 2
@testUser.save
0 голосов
/ 19 января 2012

Журналы указывают, что оно действительно достигает действия обновления:

Started PUT "/users/4"
  processing by UsersController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"HBB9IcKpWyjSbrmh6os=", "user"=>{"role"=>"3"}, "commit"=>"Update", "id"=>"4"}
Redirected to http://10.100.2.66:3000/users/4
Completed 302 Found in 1ms

Первая строка выглядит как действие show, но помните, что действия show являются запросами GET.То, что запрос «PUT» означает, что он направлен на действие обновления.Запуск rake routes подтверждает это:

rake routes
PUT    /users/:id(.:format)    {:controller=>"users", :action=>"update"}

Это еще раз подтверждается строкой 2: processing by UsersController#update as HTML говорит нам, что rails обрабатывает действие обновления UsersController как HTML (в отличие от JSON, например).

В другой теме я заметил, что ваш атрибут User#role вводит в заблуждение.Вы должны назвать его role_id, чтобы указать, что это целое число, связанное с Role, и обновить свой код следующим образом:

# user.rb
attr_accessible :role_id
belongs_to :role

# app/views/users/edit.html.erb
<%= f.collection_select(:role_id, Role.all, :id, :name)

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...