我有两个模型:Boards
和Topics
。我希望能够将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>
我也在我的Boards
和Topics
控制器中使用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 。
答案 0 :(得分:1)
我相信你的设计是错误的。
从一开始,我就说你有一个商业模式Board
,它引用一个或多个Topics
和一个Topic
被一个或多个{{1}引用}。所以,从逻辑上讲,你有类似的东西:
因此,这些是两个独立的资源,它们具有多对多的关系。
我的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情况下,通过该链接,您应该使用两个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%>
行动。
请改为尝试:
{{1}}
尽管如此,由于您没有更新整个主题,因此仍然没有任何约定。您可能希望使用额外的操作来使用PATCH动词向主板添加主题。