0

成员创建属于他们和另一个模型问题的投票。目前我正在使用隐藏表单并传递适当的参数来执行此操作。这是问题索引视图的代码:

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

4 回答 4

1

如果issuemember_id在您之前在控制器中可用vote.save!,您可以在那里手动设置它们。

于 2012-10-09T04:51:20.970 回答
1

通常,您member_idcurrent_user控制器中获取值,而不是通过表单参数传递它。您目前拥有它的方式确实使您面临大规模分配。

于 2012-10-09T04:55:14.137 回答
1

在控制器中使用范围:

@issue = Issue.find(params[:issue_id])
@vote = @issue.votes.new(params[:vote])
@vote.save

并且不要将 member_id 和 issue_id 传递给隐藏字段。

如果您有适当的嵌套 RESTful 路由,您应该能够直接获取 params[:issue_id]。

于 2012-10-09T12:13:02.330 回答
0

会员必须在投票前登录吗?如果是这样,那么您不需要将 member_id 作为隐藏字段包含在内,因为您可以在控制器中获取 current_user,这将提供良好的保护,因为成员破解 issue_id 或类型不会有任何优势。

于 2012-10-09T05:05:35.033 回答