2014-12-11 1 views
0

У меня есть две модели: Boards и Topics. Я хочу, чтобы иметь возможность добавить Topics в Boards. Мои вложенные ресурсы:отсутствует или пустое значение

resources :boards do 
    resources :topics 
end 

Мой 'доски # шоу' действие:

def show 
    @board = Board.find(params[:id]) 
    @new_topics = Topic.all 
end 

в котором перечислены все сообщения и имеет link_to:

<ul> 
    <%@new_topics.each do |i|%> 
     <li><%=i.title%> <%=link_to "Add", board_topic_path(@board,i), :method=> :put%></li> 
    <%end%> 
</ul> 

Я также использую strong_params для мой Boards и Topics:

boards_controller:

def update 
    @board = Board.find(params[:board_id]) 
    @topic = Topic.find(params[:id])   

    if @board.update(board_params) 
     flash[:notice] = "Added!" 
     @board.topics << @topic 
     redirect_to boards_path 

    else 
     flash[:alert] = "Problem!" 
     redirect_to boards_path 
    end 

end 

... 
private 

def board_params 
    params.require(:board).permit(:name,:description) 
end 

topics_controller:

... 
private 

def topic_params 
    params.require(:topic).permit(:title,:body,:user_id) 
end 

сообщение об ошибке я получаю: паров отсутствуют или значение пустое: тема.

+0

Вся установка неправильная. Ваша ссылка с методом 'put' не проходит ни одного параметра запроса' topic'. Вот почему вы получаете эту ошибку. Кроме того, ссылка должна была быть с 'board_topic_path (@board, i)' вместо этого. Но все равно это не решит вашу проблему. Дизайн модели неправильный. Вы предполагаете в своих ресурсах, что темы относятся к доскам, но я вижу, что ваш контроллер загружает темы с помощью темы «Topic.all», что означает, что темы существуют сами по себе, и они не принадлежат к доскам. Вам нужно переосмыслить свой дизайн своим другом. –

+0

Уже попытался заменить две переменные в link_to. Не помогло. В моем представлении 'controller # show' перечислены все темы как' Topic.all', и они существуют здесь, потому что я хочу видеть список всех тем и быть в состоянии добавить их в текущую плату, используя ' @ board.topics << @ topic', который запускается 'link_to'. Каково было бы ваше предложение? –

ответ

0

В RESTful ситуации, как ваша, с этой ссылке вы должны ударять update действие TopicsController с двумя params: board_id и id.

Попробуйте вместо этого:

# boards_controller.rb 
def update 
    @board = Board.find(params[:id]) 
    @topic = Topic.find(params[:topic_id])   

if @board.update(board_params) 
    flash[:notice] = "Added!" 
    @board.topics << @topic 
    redirect_to boards_path 

else 
    flash[:alert] = "Problem!" 
    redirect_to boards_path 
end 

end 

# In the view 
<%=link_to "Add", board_path(@board, topic_id: i.id), :method=> :put%> 

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

1

Я считаю, что ваш дизайн неправильный.

Начиная с самого начала, я бы сказал, что у вас есть бизнес-модель Board, которая ссылается на один или несколько Topics и Topic, на который ссылается один или более Boards. Так, по логике вещей у вас есть что-то вроде этого:

Boards&Topics

Таким образом, эти две независимых ресурсов, что у них есть много-ко-многим.

Моя модель с Rails был бы:

# routes 
resources :boards 
resources :topics 

Другими словами, тем не вложенными ресурс досок. Если бы это было так, это означало бы, что темы совета умрут, когда совет умрет. Насколько я понимаю, это не ваш случай.

Теперь, поскольку отношения много-ко-многим, вам понадобится 3-я таблица для хранения ваших ассоциаций (таблицы boards и таблицы topics не хватает). Читайте это на Rails Guides.

Кратко:

class Board 
    has_and_belongs_to_many :topics 
end 

class Topic 
    has_and_belongs_to_many :boards 
end 

Теперь, если вы хотите добавить тему к доскам на вашем пользовательском интерфейсе, то вам нужно иметь форму для редактирования доски. Эта форма, помимо других, должна иметь несколько блоков выбора с темами, которые будут добавлены на доску. Затем в вашем методе boards_controller#updateparam[:board] будет иметь атрибут topic_ids[], который будет автоматически использоваться для связывания отдельных/выбранных тем с редактируемой вами доской. Rails делает это автоматически.

Примечание Я не склонны использовать has_and_belongs_to_many Rails association. У этого есть много ограничений. Вы всегда можете создать свою собственную таблицу, которая будет содержать ассоциацию «многие-ко-многим» и другие дополнительные атрибуты, которые потребуются вашей бизнес-модели. Например, для каждой темы, прикрепленной к доске, вы можете захотеть сохранить тему или автора. Я не знаю. В этом случае может потребоваться более настраиваемая модель:

class Board 
    has_many :board_topics 
    has_many :topics, through: :board_topics 
end 

class Topic 
    has_many :board_topics 
    has_many :boards, through: :board_topics 
end 

class BoardTopic 
    belongs_to :topic, inverse_of: :board_topics 
    belongs_to :board, inverse_of: :board_topics 
    .... add other attributes that give real business value to this association .... 
end 
+0

Извините, я забыл упомянуть, что две модели уже имели отношения «многие-ко-многим» через 'has_and_belongs_to'. Я думаю, что все проблемы вызваны тем, как мое приложение обрабатывает 'strong_params' для моделей с отношениями« многие ко многим », потому что модели' reply' и 'topic', с отношением': reply принадлежит_to: topic ', обрабатывают такой же сценарий, не возвращая никаких ошибок. Я не хочу использовать форму для добавления тем в доски, я специально использую 'link_to', так как было бы разумнее предоставить конечному пользователю возможность добавлять темы к доскам непосредственно на панели # show'. –

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

  • Нет связанных вопросов^_^