成员创建属于他们和另一个模型的投票,问题。目前我正在使用隐藏表单并传递适当的参数。这是问题索引视图中的代码:
<%= form_for(@vote) do |f| %>
<%= f.hidden_field "issue_id", :value => issue.id %>
<%= f.hidden_field "member_id", :value => session[:member_id] %>
<%= f.hidden_field "type", :value => :Upvote %>
<%= f.label issue.upvotes_count(issue.id) %>
<%= submit_tag "Up", :class => 'up-vote' %>
<% end %>
这似乎不太理想,因为它使issue_id和member_id对大规模分配开放。有没有更好的方法来使用button_to标签或其他东西?
这是控制器代码:
class VotesController < ApplicationController
#GET
def new
@vote = Vote.new
end
# POST
def create
@vote = Vote.new(params[:vote])
@vote.member_id = current_member
if @vote.save
redirect_to issues_path
else
redirect_to issues_path, notice: "you must be logged in to vote"
end
end
end
和
class IssuesController < ApplicationController
# GET
def index
@issues = Issue.find(:all)
@vote = Vote.new
end
# GET
def show
@issue = Issue.find(params[:id])
respond_to do |format|
format.html
format.js
end
end
end
答案 0 :(得分:1)
如果issue
和member_id
在控制器vote.save!
之前可用,您可以在那里手动设置它们。
答案 1 :(得分:1)
通常,您在控制器中从member_id
获取current_user
之类的值,而不是通过表单参数传递它。你如何拥有它确实会让你接受大规模分配。
答案 2 :(得分:1)
在控制器中使用范围:
@issue = Issue.find(params[:issue_id])
@vote = @issue.votes.new(params[:vote])
@vote.save
并且不要将member_id和issue_id传递给隐藏字段。
如果你有适当的嵌套RESTful路由,你应该能够直接获得params [:issue_id]。
答案 3 :(得分:0)
会员在投票前必须登录吗?如果是这样,那么你不需要将member_id包含为隐藏字段,因为你可以在控制器中获取current_user,这将提供良好的保护,因为成员攻击issue_id或输入没有任何优势。