2016-02-06 7 views
2

Я новичок в RoR. Мой вопрос об обновлении attr.Rails: обновление присоединилось к атрибуту Active Model

class User 
    has_many :toys 
end 

class Toy 
    belongs_to :user 
end 

и у меня есть страница с формой пользователя, где можно обновить атрибуты пользователя, а также некоторые атрибуты связанного user_devices:

<%= f.text_field :age %> # from user 
<%= f.text_field :email %> # from user 
.... 
<%= f.check_box :is_new %> # from toy!! 

Когда я отправляю форму и обновить все атрибуты, используя update_attributes(), она показывает «ActiveModel :: MassAssignmentSecurity :: Ошибка»

@user.update_attributes(params[:user]) # it gives ActiveModel::MassAssignmentSecurity::Error 

Еще одна проблема, я не знаю, как назвать «is_new» атрибут, как это в игрушечной таблице .. Должно ли это быть: toys_is_new?

Я хочу, чтобы соответствующие атрибуты игрушки обновлялись. ты можешь помочь мне с этим?

+2

причина http://api.rubyonrails.org/classes/ActionController/Parameters.html .. прочитайте и реализуйте. –

+0

Спасибо за совет. Я нашел [эту ссылку] (http://apidock.com/rails/v3.2.3/ActiveRecord/NestedAttributes/ClassMethods/accepts_nested_attributes_for) тоже помог. – kong

+0

BTW, возможно ли это на рельсах 3.2.13? Есть ли способ обхода этой версии? – kong

ответ

1

Поскольку is_new? от Toy, вы должны использовать accepts_nested_attributes_for:

#app/models/user.rb 
class User < ActiveRecord::Base 
    has_many :toys 
    accepts_nested_attributes_for :toys 
end 

#app/controllers/users_controller.rb 
class UsersController < ApplicationController 
    def edit 
    @user = User.find params[:id] 
    end 

    def update 
    @user = User.find params[:id] 
    @user.update user_params 
    end 

    private 

    def user_params 
    params.require(:user).permit(:age, :email, toys_attributes: [:is_new]) 
    end 
end 

Чтобы получить эту работу в view, вам нужно использовать fields_for помощника:

#app/views/users/edit.html.erb 
<%= form_for @user do |f| %> 
    <%= f.fields_for :toys, @user.toys do |t| %> 
    <%= t.object.name %> 
    <%= t.check_box :is_new %> 
    <% end %> 
    <%= f.submit %> 
<% end %> 
+0

Hi @rich peck, Спасибо за помощь. Я передал ошибку ошибки обновления, но другой приходит сюда: *** TypeError Exception: не может преобразовать символ в строку. Он исходит из метода user_params; кажется, интерпретатор не распознает: пользовательский символ. – kong

+0

ой черт .. Я забыл упомянуть, что я использую рельсы 3.2.13! – kong

0

You необходимо использовать Strong Parameters. Он был введен в Rails 4.

Пример:

У вас есть модель User с id, firstname, lastname, email. Пользователь должен только обновлять первое и последнее имя.

Ваш взгляд:

<%= form_for @user do |f| %> 
    <%= f.text_field :firstname %> 
    <%= f.text_field :lastname %> 
    <%= f.submit %> 
<% end %> 

Ваш контроллер:

before_action :set_user 

def edit 
end 

def create 
    if @user.update user_params 
    # Set success message 
    # redirect to proper site 
    else 
    # Set error 
    render :edit 
    end 
end 


private 

def set_user 
    @user = User.find(params[:id]) # Rescue against ActiveRecord::RecordNotFound error 
end 

def user_params 
    params.require(:user).permit(:firstname, :lastname) # Here the strong parameters stuff happens 
end 

Если вы хотите, чтобы разрешить больше параметров вы просто должны добавить их к вызову permit метода.

Вы получили эту ошибку только из соображений безопасности.

Вы можете отключить сильные параметры с помощью config.action_controller.permit_all_parameters = true, но я настоятельно рекомендую вам использовать эту функцию.