param丢失或值为空

时间:2014-12-11 00:00:09

标签: ruby-on-rails-4 strong-parameters nested-resources

我有两个模型:BoardsTopics。我希望能够将Topics添加到Boards。我的嵌套资源是:

resources :boards do 
    resources :topics
end

我的'板#show'动作:

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>

我也在我的BoardsTopics控制器中使用strong_params,如下所示:

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

我收到的错误消息: param丢失或值为空:topic

2 个答案:

答案 0 :(得分:1)

我相信你的设计是错误的。

从一开始,我就说你有一个商业模式Board,它引用一个或多个Topics和一个Topic被一个或多个{{1}引用}。所以,从逻辑上讲,你有类似的东西:

Boards&Topics

因此,这些是两个独立的资源,它们具有多对多的关系。

我的Rails模型应该是:

Boards

换句话说,主题不是板的嵌套资源。如果是这样,这意味着当董事会死亡时董事会的主题将会死亡。据我所知,这不是你的情况。

现在,既然关系是多对多的,那么你需要一个第三个表来保存你的关联(表# routes resources :boards resources :topics 和表boards是不够的)。请阅读Rails Guides

简言之:

topics

现在,如果您想在UI上向主板添加主题,那么您需要有一个表单来编辑主板。此表单除了其他表单外,还需要有一个多选框,其中包含将添加到主板的主题。然后,在class Board has_and_belongs_to_many :topics end class Topic has_and_belongs_to_many :boards end 方法上,boards_controller#update将拥有一个属性param[:board],该属性将自动用于将特定/所选主题与您正在编辑的主板相关联。 Rails会自动执行此操作。

注意我不倾向于使用topic_ids[] Rails关联。它有很多局限性。您始终可以设计自己的表,该表将包含业务模型所需的多对多关联和其他额外属性。例如,对于附加到棋盘的每个主题,您可能希望保留主题或作者。我不知道。在这种情况下,可能需要更自定义的模型:

has_and_belongs_to_many

答案 1 :(得分:0)

在您的RESTful情况下,通过该链接,您应该使用两个updateTopicsControllerparamsboard_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%> 行动。

请改为尝试:

{{1}}

尽管如此,由于您没有更新整个主题,因此仍然没有任何约定。您可能希望使用额外的操作来使用PATCH动词向主板添加主题。