RoR: Как изменить контроллер так, чтобы он принимал только обновление нескольких параметров? - PullRequest
0 голосов
/ 12 июля 2010

Вот код, сгенерированный rails:

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

  respond_to do |format|
    if @user.update_attributes(params[:user])
      flash[:notice] = 'User was successfully updated.'
      format.html { redirect_to(@user) }
      format.xml  { head :ok }
    else
      format.html { render :action => "edit" }
      format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
    end
  end
end      

Но я не хочу, чтобы пользователь обновлял пользователя целиком, предположим, что у моего пользователя есть имя, имя и пол, вместо того, чтобы удалять пол из представления, я хочу ограничить, чтобы метод обновления принимал ТОЛЬКО имена и имена , если он / она хочет обновить пол, я не позволю ему / ей сделать это. Как я могу ограничить действия пользователя? спасибо.

Ответы [ 4 ]

3 голосов
/ 12 июля 2010

или добавьте пользовательский метод @user.update_only(), который также упрощает повторное использование в различных контекстах ...

class User
  def update_only(attrs = {}, *limit_to)
    update_attributes(attrs.delete_if { |k,v| !limit_to.include?(k.to_sym) })
  end
end

Тогда просто сделайте что-нибудь в духе

@user.update_only(params[:user], :fname, :lname)
2 голосов
/ 12 июля 2010

В ActiveRecord есть два метода, которые могут пригодиться в таких случаях: attr_protected и attr_accessible.

Вы используете их так:

class MyModel < ActiveRecord::Base
    attr_accessible :fname, :lname #Allow mass-assignment
    attr_protected :secret #Do not allow mass-assignment
end

model = MyModel.new(:fname => "Firstname", :lname => "Lastname", :secret => "haha")
puts model.fname # "Firstname"
puts model.lname # "Lastname"
puts model.secret = nil # Can not be set through mass-assignment
model.secret = "mysecret" # May only be assigned like this
puts model.secret # "mysecret"

Однако, если вам нужна только эта функциональность в одном месте, решение Salil будет работать так же хорошо.

Следует отметить, что вы должны использовать attr_acessible для атрибутов белого списка, которые можно назначать массово, и защищать все остальные атрибуты. Тем самым вы мешаете подлым людям обновлять данные, к которым они не должны прикасаться.

См. документы для получения дополнительной информации.

1 голос
/ 12 июля 2010

Использовать хеш-параметры update_attributes

@user = User.find(params[:id])
@user.update_attributes(:fname=>params[:user][:fname], :lname=>params[:user][:lname])
0 голосов
/ 12 июля 2010

Вы можете удалить нежелательные атрибуты из param[:user] Hash:

# ...
attributes = params[:user]
gender = attributes.delete :gender
raise SomeError unless gender.blank?
if @user.update_attributes(attributes)
  # ...
end
# ...

Этот код удаляет :gender из хэша и проверяет, заполнен ли он. Если это так, возникает исключение. Конечно, вы могли бы дать хорошее предупреждение или молча проигнорировать тот факт, что пол был заполнен.

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