2015-11-20 2 views
2

Я пытаюсь разбить процесс регистрации своего приложения на куски размером с кусочек.Rails 4 update_attributes с вложенными атрибутами, не сохраняющими

Итак, я отправляю формы через Ajax и просто пытаюсь обновить некоторые атрибуты моделей, которые были доступны на этом этапе этого процесса, в основном это означает, что они не будут действительны в каждой точке сохранения.

В результате я использовал update_attribute, который отлично работает. Однако один из моих атрибутов - ассоциация has_many, и я изо всех сил пытаюсь добиться этого.

У меня есть Channel модель с has_many :channel_tags, а также accepts_nested_attributes_for :channel_tags. Сохранение и обновление отлично работают при использовании метода обновления, но я не могу заставить его работать с update_attribute или update_attributes.

Насколько я могу судить, мне нужно использовать update_attributes. Я хотел сделать что-то вроде:

@channel.update_attributes(channel_tags_attributes: params[:channel][:channel_tags_attributes]) 

Но это не создает новые channel_tags. Я также попытался с:

@channel.update_attributes(tag_params) 

и:

params.require(:channel).permit(channel_tags_attributes: [ :id, :channel_id, :tag_id, :_destroy ]); 

Но опять же, это только кажется, не делать ничего.

При проверке с консоли выясняется, что все это происходит потому, что она загружает Channel для базы данных, а затем в категорию.

Я делаю что-то неправильно или есть лучший способ сделать это?

+0

Вы пробовали @ channel.update_attributes (Params [: канал] [: channel_tags_attributes])? –

+0

Нам нужна дополнительная информация. Можете ли вы показать свою форму и/или параметры, которые публикует форма? –

ответ

-1

Как вы пытаетесь сделать это с помощью вложенных атрибутов в рельсах 4, то ваш код должен выглядеть,

В модели тега

has_many :channel_tags 
accepts_nested_attributes_for :channel_tags, allow_destroy: true 

Контроллер должен выглядеть

def update 
    @tag = Tag.find(params[:id]) 
    puts "==== #{tag_params.inspect} ====" 
    puts "==== #{tag_params[:channel_tags].inspect} ====" 
    if @tag.update!(tag_params) 
    redirect_path 
    end 
end 
private 
def tag_params 
    params.require(:tag).permit(:name ,channel_tags_attributes: [:id, :channel_id, :tag_id, :_destroy]) 
end 

While обновляя атрибуты, пожалуйста, проверьте журналы сервера, поскольку я проверяю параметры, которые вы пытаетесь обновить для атрибутов тега.

.update_attributes будет только тогда, когда вы хотите получить определенные атрибуты. .update будет использовать HASH в параметрах, которые мы определяем как сильные параметры.

0

Попробуйте изменить имя разрешенного метода Params: -

def channel_params 
    params.require(:channel).permit(channel_tags_attributes: [ :id, :channel_id, :tag_id, :_destroy ]); 
end 

и пользователь этот метод обновления атрибутов: -

def update 
    @channel = Channel.find(params[:id]) 
    if @channel.update_attributes(channel_params) 
     # add your code here 
    end 
end 
Смежные вопросы