我试图在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()
端
答案 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 %>
请注意,这应使用PATCH
或PUT
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]) %>