2012-04-23 1 views
1

У меня есть модель сообщения и модель пользователя. мое сообщение belongs_to мой пользователь и пользователь has_many сообщений.Передача значения идентификатора контроллеру, получение сообщения об ошибке массового присвоения

Я пытаюсь разрешить пользователю личное сообщение другого пользователя, находясь на странице их общего профиля (их шаблон отображения). Я пробовал несколько попыток, но в конечном итоге я возвращаюсь к вопросу о том, что ID должен быть attr_accessible (что я слышал плохо делать). Я делаю что-то неправильно?

Моя модель сообщение, у меня есть :user_id (который является текущий пользователь, он же sending_from ID), :to_id, :content.

Когда я смотрю на странице профиля пользователя, на шаблоне шоу у меня есть

<%= form_for([current_user, @message]) do |f| %> 
     <%= f.hidden_field :to_id, :value => @user.id %> 
     <div class="field"> 
      <%= f.text_area :content, placeholder: "Send a private message..." %> 
     </div> 
     <%= f.submit "Post", class: "btn btn-large btn-primary" %> 
    <% end %> 

В моем пользовательском шоу действий, у меня есть

def show 
    @user = User.find(params[:id]) 
    @microposts = @user.microposts.paginate(page: params[:page]) 
    if user_signed_in? 
     @message = current_user.messages.build(params[:messages], to_id: @user.id) 
    end 
end 

, когда форма представляет, она идет к моему сообщению создать действие

def create 
    @message = current_user.messages.build(params[:message]) 
    redirect_to user_path(params[:message][:to_id]) 
end 

Однако, я всегда получаю ошибку

`Can't mass-assign protected attributes: to_id` 

Похоже, я могу исправить это, сделав :to_id attr_accessible, однако я слышал, что это не очень безопасно. Я делаю что-то неправильно? Этот вопрос убивает меня.

Любая помощь будет оценена по достоинству. Thanks

+0

, прежде чем я редактировал это, вам придется иметь дело с некоторыми [Alots] (http://hyperboleandahalf.blogspot.com /2010/04/alot-is-better-than-you-at-everything.html)! –

ответ

2

Изготовление to_id доступно в порядке. Но если вы не хотите, что ошибка просто исправить это следующим образом:

def create 
    @message = current_user.messages.build 
    @message.to_id = params[:message][:to_id] 
    # manually assign whatever other params you need to 
    redirect_to user_path(params[:message][:to_id]) 
end 

Массовое назначение просто означает, что вы не можете использовать update_attributes, вы все еще можете использовать model.attribute=. Причина делать это таким образом может быть, чтобы добавить дополнительные параметры Whitelisting, такие как:

def create 
    safe_params = params[:model].slice(:safe_attr1,:safe_attr2) 
    @model = Model.new(safe_params) 
    whitelist = ['some_safe_string','another_safe_string'] 
    if whitelist.include?(params[:model][:dangerous]) 
    @model.dangerous_attribute = params[:model][:dangerous] 
    end 
    @model.save 
    redirect_to @model 
end 
+0

определенно спасибо за помощь снова =) и спасибо за объяснение. это было очень полезно. я думал, что сначала я не мог сэкономить, если я не сделал это attr_accessible – Sasha