2017-04-11 244 views
0

我想通过使用link_to与rails上的ruby传递参数,但它说我正在发送的id参数为null。 我从哪里发送身份证的代码。为审查控制器传递参数使用link_to

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

您在

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

错过.id但它不是A G ood解决方案。如果您的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的信息。

+0

省略ID其实并不重要,因为铁轨调用'.to_param'在模型上。 'paper_path(paper)','paper_path(id:paper)'和'paper_path(id:paper.id)'的结果是相同的。 – max

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