Синтаксис Ruby on Rails - PullRequest
       3

Синтаксис Ruby on Rails

0 голосов
/ 22 декабря 2010

Это один из тех вопросов, которые вы только что знаете, заставит вас чувствовать себя глупо, когда вы знаете ответ, но я просто не могу заставить эту штуку работать, так что дальше. В railstutorial.org я пытаюсь выполнить упражнение 5 в конце главы 10, но следующий код неисправен, и каждый вариант, который я пробую (например, с использованием «если»), не работает. Я просто хочу выполнить две строки кода, если текущий пользователь не является администратором. Куда я иду не так?

def destroy
  if !current_user.admin?
    User.find(params[:id]).destroy
    flash[:success] = "User destroyed."
  end
  redirect_to users_path
end

РЕДАКТИРОВАТЬ: я путал текущего пользователя с пользователем, которого нужно удалить. Я использую код Адитьи, который, я уверен, правильный, но теперь я получаю сообщение «не могу запустить тесты», в котором говорится, что в моих тестах есть синтаксическая ошибка (ниже).

describe "as an admin user" do

  before(:each) do
    admin = Factory(:user, :email => "admin@example.com", :admin => true)
    test_sign_in(admin)
  end

  it "should not allow an admin user to destroy himself" do
    lambda do
      delete :destroy, :id => admin
    end.should_not change(User, :count)
  end

end

Ответы [ 5 ]

6 голосов
/ 22 декабря 2010
def destroy
  if current_user.admin? 
    # If the current user IS admin
    User.find(params[:id]).destroy # Find the user and destroy it
    flash[:success] = "User destroyed." # Set the flash
  end
  redirect_to users_path # Go to users.
end

Ваше условие if не имеет смысла. Было сказано, если пользователь НЕ является администратором, уничтожить. Тогда как я представляю, что только администраторы могут уничтожать пользователей. :)

РЕДАКТИРОВАТЬ: прочитав Упражнение 5 главы 10 Railstutorial.org, я получил более ясную идею. :) Измените действие уничтожения, чтобы пользователи-администраторы не уничтожали себя.

Я знаю, что это может быть мошенничеством, но это ТАК, и мы лохи, чтобы помочь!

def destroy
  user = User.find(params[:id])
  if user != current_user
    user.destroy
    flash[:notice] = "User destroyed".
  else
    flash[:error] = "Suicide is immoral."
  end
  redirect_to users_path
end

Еще одно редактирование, ТОЛЬКО админы не могут падать на меч.

def destroy
  user = User.find(params[:id]) # Find the victim
  if (user == current_user) && (current_user.admin?)
    flash[:error] = "Suicide is immoral."
  else
    user.destroy
    flash[:notice] = "User destroyed".
  end
  redirect_to users_path
end
0 голосов
/ 25 июля 2012

Я задал тот же вопрос. Я использовал

def destroy
      User.find(params[:id]).destroy unless current_user.admin? 
      flash[:success] = "User destroyed."
      redirect_to users_path

    end

немного прикольный, но короткий!

0 голосов
/ 05 августа 2011

Что касается редактирования OP, включая тест rspec, переменная 'admin' должна быть не локальной, а переменной экземпляра (@admin):

describe "as an admin user" do
  before(:each) do
    @admin = Factory(:user, :email => "admin@example.com", :admin => true)
    test_sign_in(@admin)
  end

  it "should not destroy himself" do
    lambda do
      delete :destroy, :id => @admin
    end.should_not change(User, :count)
  end
end

Кроме того, я сделал несколько других модификаций кода контроллера:

...
before_filter :authenticate_admin, :only => :destroy
...
def destroy
  user = User.find(params[:id])
  if user != current_user
    user.destroy
    flash[:success] = t(:user_deleted_message)
  else
    flash[:error] = t(:user_not_deleted_message)
  end
  redirect_to users_path
end
...
private
  def authenticate_admin
    if current_user.nil?
      redirect_to(signin_path)
    else
      redirect_to(root_path) unless current_user.admin?
    end
  end
...

Надеюсь, это поможет кому-то другому найти решение для упражнения из учебника.

0 голосов
/ 22 декабря 2010

Поскольку код, который вы написали, делает то, что, как вы думаете, он делает, ошибка в User#admin?.Чтобы проверить это, откройте rails console и найдите текущего пользователя вручную.Это действительно админ, что говорит база данных?Позвоните admin? вручную и посмотрите, что он вернет.Если пользователь является администратором по базе данных, то ошибка в реализации admin? -метода.

0 голосов
/ 22 декабря 2010

Что именно не работает?

Проверьте, существует ли пользователь с параметром id, который вы передаете. User.find возвращает nil, если пользователь с указанным идентификатором не найден. Вызов уничтожить на ноль вызовет ошибку.

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