Rails:将嵌套资源的ID从button_to传递到controller /以在管理视图中切换boolean

时间:2015-04-16 23:27:04

标签: ruby-on-rails controller nested boolean button-to

我坐在这里,因为黎明时代试图在Rails中切换一个布尔值,以便管理员验证提交。

我有一个标准"文章"模型,has_many" Prosols" (反过来又属于"文章")。 Prosol有一个布尔" profeat1"。 由于有一组button_to(如下所示),我试图切换它。 我正在浏览文章prosols,在bootstrap模板中显示它们,并显示每个按钮以验证与否。 问题是所有按钮都指向第一个prosol。似乎prosol ID没有准确地传递给控制器​​。

No route matches {:action=>"unpro1", :article_id=>5, :controller=>"prosols", :id=>nil} missing required keys: [:id]

这是代码。

文章#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传递给控制器​​。 如果您看到更好/不同的方式来实现最终结果,我将热烈欢迎您的建议。 同样,我的目标是显示文章的所有prosols,并使用管理按钮进行验证。 到目前为止,我已经彻底尝试了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 %>

我的初始错误有2个来源: - 用@而不是指针指向嵌套的prosol,因为它已在循环中指向 - 文章控制器中的剩余残留物如下:

def show
 @article = Article.find(params[:id])
 @prosols = @article.prosols.all    <--- wrong
 @prosol = @article.prosols.build   <--- wrong
end

大。现在它是啤酒的时间。

2 个答案:

答案 0 :(得分:2)

不应该这样:

<% 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 %>

答案 1 :(得分:0)

问题似乎是您在按钮中使用@prosol,该按钮尚未分配,因此返回nil。

你的评论中定义的循环设置了prosol,而不是@prosol。放弃&#39; @&#39;符号,你应该没事。

- 编辑 -

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是一个零对象。