2014-12-11 154 views
0

我有兩種型號:BoardsTopics。我希望能夠將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爲我的BoardsTopics控制器如下:

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'加載主題,這意味着這些主題是獨立存在的,並且它們不屬於主板。你需要重新考慮你的設計我的朋友。 – 2014-12-11 05:50:05

+0

已經嘗試交換link_to中的兩個變量。沒有幫助。我的'controller#show' action將所有主題列爲'Topic.all',並且它們在這裏存在,因爲我希望能夠看到所有主題的列表,並且能夠將它們添加到當前的主板, @ board.topics << @ topic',由'link_to'觸發。你的建議是什麼? – 2014-12-11 06:00:42

回答

0

在RESTful情況是你的,與該鏈接,你應該打兩paramsTopicsControllerupdate行動:board_idid

試試這個:

# 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

我相信你的設計是錯誤的。

從一開始起,我要說的是,你必須引用一個或多個Topics商業模式Board並且由一個或多個Boards引用的Topic。因此,邏輯上你有這樣的事情:

Boards&Topics

所以,這是兩個獨立的資源,他們有一個多一對多的關係。

我使用Rails模型會一直:

# routes 
resources :boards 
resources :topics 

換句話說,主題沒有嵌套板的資源。如果是這樣,這意味着當董事會死亡時董事會的主題將會消失。據我瞭解,這裏不是你的情況。現在

,因爲關係是多到多,那麼你將需要一個第三表來保存你的協會(表boards和表topics是不夠的)。閱讀Rails Guides

簡述:

class Board 
    has_and_belongs_to_many :topics 
end 

class Topic 
    has_and_belongs_to_many :boards 
end 

現在,如果你想主題添加到主板上的UI,那麼你需要有一個表格編輯板。這種形式除了其他形式之外,還需要有一個多選框,其中包含將添加到板上的主題。然後在您的boards_controller#update方法param[:board]將有一個屬性topic_ids[]將自動用於將特定/選定的主題關聯到您正在編輯的板。 Rails自動執行。我不喜歡使用has_and_belongs_to_many Rails關聯。它有很多限制。您始終可以設計自己的表格,該表格將包含您的業務模型所需的多對多關聯和其他額外屬性。例如,對於連接到董事會的每個主題,您可能需要持有主題或作者。我不知道。在這種情況下,可能需要更多自定義模型:

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 belongs_to:topic'關係,處理相同的情況下不返回任何錯誤。我不想使用表單來爲主板添加主題,我特別使用'link_to',因爲讓最終用戶能夠直接在主板上添加主題, show'。 – 2014-12-12 21:57:05

相關問題