使用link_to

时间:2017-04-11 19:54:46

标签: ruby-on-rails

我试图在rails上使用带有ruby的link_to传递参数,但它说我发送的id参数为null。 我发送id的代码。

<% @conference.papers.each do |paper| %>
 <tr>
   <td><%= paper.title %></td>
   <td><%= paper.author %></td>
    <td><%= link_to "Download Paper", paper.attachment_url %></td>
    <td><%= link_to 'Reviews', paper %></td>
    <% if (paper.accepted) %>
        <td><%= "Accepted" %></td>
    <% else %>
        <td><%= "Not accepted" %></td>
    <% end %>
    <% if (@state1 && paper.accepted == false) %>
    <td><%= button_to "Accept",  accept_paper_path(id: paper.id), class: "btn btn-danger", data: { confirm: "Are you sure that you wish to accept #{paper.title}?"} %></td>
    <% end %>
    <% if (@state2) %>
    <% session["a"] = paper.id %>
    <td><%= link_to "Review paper", new_review_path(id: paper) %></td>
    <% end %>

 </tr>
<% end %>

审核控制器的代码

  def new
@paper = Paper.find_by_id(params[:id])

@review = Review.new()

2 个答案:

答案 0 :(得分:0)

你错过了.id

link_to "Review paper", new_review_path(id: paper.id)

但这不是一个好的解决方案。如果您的Paper模型has_many :reviews,最好将reviews路由嵌套在paper的路由中。像这样:

# config/routes.rb

resources :papers do
  resources :reviews
end

因此,您的link_to将如下所示:

link_to "Review paper", new_paper_review_path(paper)

将生成

  

/纸/:paper_id /评论/新

您可以详细了解Rails路由here

答案 1 :(得分:0)

让我们首先正确设置路线:

resouces :papers do
  member do 
    patch :accept
  end
end 

这将允许您接受PATCH /papers/:id的审核。要创建按钮,请使用:

<%= button_to accept_paper_path(paper), method: :patch %>

请注意,这应使用PATCHPUT http方法 - 而不是GET,因为它是非幂等操作。

请注意,您只需传递模型而不是accept_paper_path(id: model)accept_paper_path(id: model.id)

对于评论,您需要创建所谓的nested resource

resouces :papers do
  member do 
    patch :accept
  end
  resources :reviews, only: [:new, :create]
end

这为您提供了路线/papers/:paper_id/reviews/new

<%= link_to "Review paper", new_paper_review_path(paper) %>

要设置表单以使用正确的路径创建新的审阅,请使用包含父级和子级的数组:

<%= form_for([@paper, @review]) %>