2016-06-21 3 views
2

Я следую за tutorial о том, как создать веб-сайт блога Ruby-on-Rails с комментариями и тегами, и поместил мою работу на https://github.com/khpeek/jumpstart-blogger/.UnknownAttributeError on Rails сайт

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

enter image description here

Я получаю сообщение об ошибке «ActiveRecord :: UnknownAttributeError в ArticlesController # Создание» (см ниже) ,

enter image description here

Однако, по словам руководства, я должен в этот момент ожидают статья «идти через». articles_controller.rb имеет «набор» метод tag_list:

class ArticlesController < ApplicationController 

    include ArticlesHelper 
    def index 
    @articles = Article.all 
    end 

    def show 
    @article = Article.find(params[:id]) 
    @comment = Comment.new 
    @comment.article_id = @article_id 
    end 

    def new 
    @article = Article.new 
    end 

    def tag_list=(tags_string) 
    end 

    def create 
    # fail 
    @article = Article.new(article_params) 
    @article.save 
    flash.notice = "Article '#{@article.title}' created." 
    redirect_to article_path(@article) 
    end 

    def destroy 
    @article = Article.find(params[:id]) 
    @article.destroy 
    flash.notice = "Artice '#{@article.title}' deleted." 
    redirect_to articles_path 
    end 

    def edit 
    @article = Article.find(params[:id]) 
    end 

    def update 
    @article = Article.find(params[:id]) 
    @article.update(article_params) 
    flash.notice = "Article '#{@article.title}' updated." 
    redirect_to article_path(@article) 
    end 

end 

Далее, «to_s» метод класса «Tag» был изменен, чтобы вернуть свое название:

class Tag < ActiveRecord::Base 
    has_many :taggings 
    has_many :articles, through: :taggings 

    def to_s 
     name 
    end 
end 

Короче, я не понимаю, почему tag_list не признан в качестве атрибута для Article. Как я могу это исправить?

+0

Необходимо добавить его в качестве столбца базы данных статьи - используйте миграцию. Ваш метод 'def tag_list = (tags_string)' в контроллере не похоже, что он что-то делает, и, вероятно, должен быть в модели статьи. –

ответ

6

В вас article.rb добавить:

def tag_list=(tags_string) 
    # first split the tags based on "," which is coming from the form 
    tag_names = tags_string.split(",").collect{|s| s.strip.downcase}.uniq 
    # search if any particular tag is present or not, based on that assign them 
    new_tags = tag_names.collect { |name| Tag.find_or_create_by(name: name) } 
    self.tags = new_tags 
end 

Кроме того, в articlesController.rb оный:

def article_params 
params.require(:article).permit(:title, :body, :tag_list) 
end 

Надеется, что это помогает!

+1

И вы также можете удалить пустой вопрос 'def tag_list = (tags_string)' в 'ArticlesController' в вопросе. 'Tag_list =', определенный для 'Article' в' article.rb', является единственной версией, которая будет вызываться 'Article.new (article_params)'. –

+0

Спасибо за ответы. Кажется, что ключевым моментом для его перехода является включение 'def tag_list = (tags_string)' (а не только 'def tag_list') в определение метода в' article.rb'. Я удалил пустой метод в 'ArticlesController', как предложил Рори О'Кейн, и не нужно было включать' def article_params' (по крайней мере, чтобы не избавиться от ошибки). –

+0

Исправление: код 'def article_params', данный Emu, необходим, но уже был включен в модуль' ArticlesHelper' (которого я не перечислял). –

0

Кажется, вы используете Rails 4. Вы включили tag_list в свой список разрешенных параметров Strong?

Смежные вопросы