Ruby on rails 4 参数丢失或值为空

Ruby on rails 4 参数丢失或值为空,ruby-on-rails-4,strong-parameters,nested-resources,Ruby On Rails 4,Strong Parameters,Nested Resources,我有两种型号:板和主题。我希望能够将主题添加到板。我的嵌套资源是: resources :boards do resources :topics end 我的“展示”行动: def show @board = Board.find(params[:id]) @new_topics = Topic.all end 它列出了所有帖子,并有一个链接到: <ul> <%@new_topics.each do |i|%> &l

我有两种型号:
主题
。我希望能够将
主题
添加到
。我的嵌套资源是:

resources :boards do 
    resources :topics
end
我的“展示”行动:

def show 
    @board = Board.find(params[:id])
    @new_topics = Topic.all
end
它列出了所有帖子,并有一个链接到:

<ul>
    <%@new_topics.each do |i|%>
        <li><%=i.title%> <%=link_to "Add", board_topic_path(@board,i), :method=> :put%></li>
    <%end%>
</ul>
主题\u控制器:

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
...
private

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

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

在您这样一个安静的环境中,通过该链接,您应该使用两个
参数来点击
TopicsController
update
操作:
board\u 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%>
#boards_controller.rb
def更新
@board=board.find(参数[:id])
@topic=topic.find(参数[:topic\u id])
如果@board.update(板参数)
flash[:注意]=“已添加!”
@董事会主题

尽管如此,这仍然与任何惯例不同,因为您并没有更新整个主题。您可能希望使用补丁动词,使用额外的操作将主题添加到板中

我认为你的设计是错误的

从一开始,我想说的是,您有一个参考一个或多个
主题的
Board
业务模型,以及一个或多个
Board
参考的
主题。所以,从逻辑上来说,你有这样的东西:

所以,这是两个独立的资源,它们有多对多的关系

我的Rails模型是:

# routes
resources :boards
resources :topics
换句话说,主题不是板的嵌套资源。如果是的话,这就意味着董事会的主题会随着董事会的消亡而消亡。据我所知,这不是你的情况

现在,由于关系是多对多的,因此您需要第三个表来保存关联(表
和表
主题
是不够的)。继续读这个

简而言之:

class Board
  has_and_belongs_to_many :topics
end

class Topic
  has_and_belongs_to_many :boards
end
现在,如果你想在你的用户界面上的黑板上添加主题,那么你需要一个表单来编辑黑板。除其他表单外,此表单还需要有一个多选择框,其中包含将添加到董事会的主题。然后在
boards\u controller#update
方法中,
param[:board]
将具有一个属性
topic\u id[]
,该属性将自动用于将特定/选定的主题与您正在编辑的板相关联。Rails会自动执行此操作

注意,我不倾向于使用has和mu属于多个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

整个设置都是错误的。您与
put
方法的链接未传递任何
主题
查询参数。这就是为什么会出现这个错误。除此之外,链接应该是
board\u topic\u path(@board,i)
。但是,这仍然不能解决你的问题。模型设计是错误的。您在资源中假设主题属于板,但我看到您的控制器使用
Topic.all
加载主题,这意味着主题独立存在,不属于板。你需要重新考虑你的设计,我的朋友。你已经尝试过交换链接中的两个变量。没有帮助。我的
controller#show
操作将所有主题列为
Topic.all
,它们单独存在于此处,因为我希望能够看到所有主题的列表,并能够使用
@board.topics将它们添加到当前板中,我忘了提到这两个模型已经通过
has\u和
建立了
many-to-many
关系。我认为整个问题都是由我的应用程序处理具有
多对多关系的模型的
strong_参数
的方式造成的,因为
reply
和'topic`models,with':reply-belient\u-to:topic'关系处理相同的场景而不返回任何错误。我不想使用表单向图板添加主题,我特别使用了
链接到
,因为让最终用户能够在
图板#show
上直接向图板添加主题更有意义。