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
上直接向图板添加主题更有意义。