Rails:将嵌套资源的 ID 从 button_to 传递到控制器/在管理视图中切换布尔值
Rails: Pass ID of nested resource from button_to to controller / to toggle boolean in admin view
自时代黎明以来,我一直坐在这里,试图在 Rails 中切换一个布尔值,以便管理员验证提交。
我有一个标准的 "Article" 模型,has_many "Prosols"(反过来 belongs_to "Article")。
Prosol 有一个布尔值 "profeat1"。
由于一组 button_to (如下所示),我正在尝试切换它。
我正在遍历文章 prosols,在 bootstrap 模板中显示它们,并为每个按钮显示一个按钮来验证或不验证。
问题是所有按钮都指向第一个 prosol。 prosol ID好像没有准确传给controller
No route matches {:action=>"unpro1", :article_id=>5, :controller=>"prosols", :id=>nil} missing required keys: [:id]
这是代码。
article#show.html.erb - 从原始代码中添加行
<% if admin_signed_in? %>
<% @article.prosols.in_groups_of(2) do |group| %>
<div class="container-fluid">
<% group.compact.each do |prosol| %>
<div class="col-md-6">
<div class="box3">
<h4><%= prosol.title %></h4> <br>
<%= prosol.body %> <br>
<% if prosol.profeat1 == false %>
<%= button_to "Do it", pro1_article_prosol_path(:article_id => @article.id, :id => @prosol.id), :class => 'btn btn-info'%>
<% else %>
<%= button_to "Undo it", unpro1_article_prosol_path(:article_id => @article.id, :id => @prosol.id), :class => 'btn btn-info'%>
<% end %>
</div>
</div>
<% end %>
</div>
<% end %>
<% end %>
prosols_controller.rb
def pro1
@article = Article.find(params[:article_id])
@prosol = @article.prosols.find(params[:id])
@prosol.update(profeat1: true)
redirect_to article_path(@article)
end
def unpro1
@article = Article.find(params[:article_id])
@prosol = @article.prosols.find(params[:id])
@prosol.update(profeat1: false)
redirect_to article_path(@article)
end
routes.rb
resources :articles do
resources :prosols do
post 'pro1', on: :member
post 'unpro1', on: :member
end
end
现在我认为问题在于将嵌套资源 (prosol) ID 传递给控制器。
如果您看到 better/different 实现最终结果的方法,我将热烈欢迎您的建议。
同样,我的目标是显示一篇文章的所有方案,并使用管理按钮来验证或不验证。
到目前为止,我已经彻底尝试了 StackO 上的所有其他内容,但无济于事。
等待救世主...在此先感谢。
编辑:这就是解决方案 - 文章#show.html.erb
<% if prosol.profeat1 == false %>
<%= button_to "Do it", pro1_article_prosol_path(:article_id => @article.id, :id => prosol.id), :class => 'btn btn-info'%>
<% else %>
<%= button_to "Undo it", unpro1_article_prosol_path(:article_id => @article.id, :id => prosol.id), :class => 'btn btn-info'%>
<% end %>
我最初的错误有两个来源:
- 使用@而不是没有指针指向嵌套的prosol,因为它已经在循环中指向
- 以及 Articles 控制器中的坏剩菜,如下所示:
def show
@article = Article.find(params[:id])
@prosols = @article.prosols.all <--- wrong
@prosol = @article.prosols.build <--- wrong
end
太棒了。现在是啤酒点。
问题似乎是您在按钮中使用了 @prosol,该按钮尚未分配,因此返回 nil。
您在评论中定义的循环设置了 prosol,它不是 @prosol。删除“@”符号,你应该没问题。
-- 编辑--
如 id => prosol.id
...
<% if prosol.profeat1 == false %>
<%= button_to "Do it", ..., :id => prosol.id), :class => 'btn btn-info'%>
<% else %>
<%= button_to "Undo it", ..., :id => prosol.id), :class => 'btn btn-info'%>
<% end %>
您的错误显示 id => nil
因为 @prosil 是一个 nil 对象。
不应该这样:
<% if prosol.profeat1 == false %>
<%= button_to "Do it", pro1_article_prosol_path(:article_id => @article.id, prosol.id => prosol.id), :class => 'btn btn-info'%>
<% else %>
<%= button_to "Undo it", unpro1_article_prosol_path(:article_id => @article.id, prosol.id => prosol.id), :class => 'btn btn-info'%>
<% end %>
看起来像这样?
<% if prosol.profeat1 == false %>
<%= button_to "Do it", pro1_article_prosol_path(:article_id => @article.id, :id => prosol.id), :class => 'btn btn-info'%>
<% else %>
<%= button_to "Undo it", unpro1_article_prosol_path(:article_id => @article.id, :id => prosol.id), :class => 'btn btn-info'%>
<% end %>
甚至更好:
<% if prosol.profeat1 == false %>
<%= button_to "Do it", pro1_article_prosol_path(@article, prosol), :class => 'btn btn-info'%>
<% else %>
<%= button_to "Undo it", unpro1_article_prosol_path(@article, prosol), :class => 'btn btn-info'%>
<% end %>
自时代黎明以来,我一直坐在这里,试图在 Rails 中切换一个布尔值,以便管理员验证提交。
我有一个标准的 "Article" 模型,has_many "Prosols"(反过来 belongs_to "Article")。 Prosol 有一个布尔值 "profeat1"。 由于一组 button_to (如下所示),我正在尝试切换它。 我正在遍历文章 prosols,在 bootstrap 模板中显示它们,并为每个按钮显示一个按钮来验证或不验证。 问题是所有按钮都指向第一个 prosol。 prosol ID好像没有准确传给controller
No route matches {:action=>"unpro1", :article_id=>5, :controller=>"prosols", :id=>nil} missing required keys: [:id]
这是代码。
article#show.html.erb - 从原始代码中添加行
<% if admin_signed_in? %>
<% @article.prosols.in_groups_of(2) do |group| %>
<div class="container-fluid">
<% group.compact.each do |prosol| %>
<div class="col-md-6">
<div class="box3">
<h4><%= prosol.title %></h4> <br>
<%= prosol.body %> <br>
<% if prosol.profeat1 == false %>
<%= button_to "Do it", pro1_article_prosol_path(:article_id => @article.id, :id => @prosol.id), :class => 'btn btn-info'%>
<% else %>
<%= button_to "Undo it", unpro1_article_prosol_path(:article_id => @article.id, :id => @prosol.id), :class => 'btn btn-info'%>
<% end %>
</div>
</div>
<% end %>
</div>
<% end %>
<% end %>
prosols_controller.rb
def pro1
@article = Article.find(params[:article_id])
@prosol = @article.prosols.find(params[:id])
@prosol.update(profeat1: true)
redirect_to article_path(@article)
end
def unpro1
@article = Article.find(params[:article_id])
@prosol = @article.prosols.find(params[:id])
@prosol.update(profeat1: false)
redirect_to article_path(@article)
end
routes.rb
resources :articles do
resources :prosols do
post 'pro1', on: :member
post 'unpro1', on: :member
end
end
现在我认为问题在于将嵌套资源 (prosol) ID 传递给控制器。 如果您看到 better/different 实现最终结果的方法,我将热烈欢迎您的建议。 同样,我的目标是显示一篇文章的所有方案,并使用管理按钮来验证或不验证。 到目前为止,我已经彻底尝试了 StackO 上的所有其他内容,但无济于事。
等待救世主...在此先感谢。
编辑:这就是解决方案 - 文章#show.html.erb
<% if prosol.profeat1 == false %>
<%= button_to "Do it", pro1_article_prosol_path(:article_id => @article.id, :id => prosol.id), :class => 'btn btn-info'%>
<% else %>
<%= button_to "Undo it", unpro1_article_prosol_path(:article_id => @article.id, :id => prosol.id), :class => 'btn btn-info'%>
<% end %>
我最初的错误有两个来源: - 使用@而不是没有指针指向嵌套的prosol,因为它已经在循环中指向 - 以及 Articles 控制器中的坏剩菜,如下所示:
def show
@article = Article.find(params[:id])
@prosols = @article.prosols.all <--- wrong
@prosol = @article.prosols.build <--- wrong
end
太棒了。现在是啤酒点。
问题似乎是您在按钮中使用了 @prosol,该按钮尚未分配,因此返回 nil。
您在评论中定义的循环设置了 prosol,它不是 @prosol。删除“@”符号,你应该没问题。
-- 编辑--
如 id => prosol.id
...
<% if prosol.profeat1 == false %>
<%= button_to "Do it", ..., :id => prosol.id), :class => 'btn btn-info'%>
<% else %>
<%= button_to "Undo it", ..., :id => prosol.id), :class => 'btn btn-info'%>
<% end %>
您的错误显示 id => nil
因为 @prosil 是一个 nil 对象。
不应该这样:
<% if prosol.profeat1 == false %>
<%= button_to "Do it", pro1_article_prosol_path(:article_id => @article.id, prosol.id => prosol.id), :class => 'btn btn-info'%>
<% else %>
<%= button_to "Undo it", unpro1_article_prosol_path(:article_id => @article.id, prosol.id => prosol.id), :class => 'btn btn-info'%>
<% end %>
看起来像这样?
<% if prosol.profeat1 == false %>
<%= button_to "Do it", pro1_article_prosol_path(:article_id => @article.id, :id => prosol.id), :class => 'btn btn-info'%>
<% else %>
<%= button_to "Undo it", unpro1_article_prosol_path(:article_id => @article.id, :id => prosol.id), :class => 'btn btn-info'%>
<% end %>
甚至更好:
<% if prosol.profeat1 == false %>
<%= button_to "Do it", pro1_article_prosol_path(@article, prosol), :class => 'btn btn-info'%>
<% else %>
<%= button_to "Undo it", unpro1_article_prosol_path(@article, prosol), :class => 'btn btn-info'%>
<% end %>