Я запускаю before_filter для некоторых действий, чтобы проверить, является ли пользователь current_user.
before_filter :correct_user, :only => [:edit, :update, :destroy]
def update
@user = User.find(params[:id])
if @user.update_attributes(params[:user])
redirect_to current_user, :notice => "User updated!"
else
redirect_to current_user, :notice => "User not updated. waa waa."
end
end
private
def correct_user
if current_user != @user
redirect_to root_url, :notice => "Cannot act on different user."
end
end
Не уверен, что это лучший способ сделать что-то, но он работает (может, лучше просто использовать current_user вместо поиска @user через params?)
Теперь у пользователя есть много фотографий, и в индексном списке моих фотографий я перечисляю все фотографии пользователя и позволяю ему установить любую фотографию в качестве фотографии профиля. В пользовательской таблице есть столбец primary_photo_id для хранения этого идентификатора, и я использую link_to для установки этого:
=link_to "Make this your profile photo", user_path(@user, :user => {:primary_photo_id => "#{photo.id}"}), :method => :put
Проблема в том, что before_filter запускается и мешает этому работать, потому что @user, который получается через params [: id], терпит неудачу, потому что это неправильные параметры. Если я удаляю before_filter, он работает нормально, но больше не проверяет правильность пользователя.
(второй, несколько связанный с этим вопрос, почему приведенный выше код работает, но этот:
=link_to "Make this your profile photo", user_path(@user, :primary_photo_id => "#{photo.id}"), :method => :put
нет.
Спасибо. Я довольно новичок в рельсах и программировании, поэтому все, что вы можете сказать относительно моего конкретного вопроса, и любые плохие практики, которые я делаю с кодом здесь, очень ценится.