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

通常、フォーム パラメータを介して値を渡すのではなく、コントローラでmember_idfromのような値を取得します。current_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 に答える
1

issueおよびmember_idがコントローラーで使用可能な場合vote.save!は、そこで手動で設定できます。

于 2012-10-09T04:51:20.970 に答える
0

メンバーは投票する前にログインする必要がありますか? その場合、コントローラーで current_user を取得できるため、member_id を隠しフィールドとして含める必要はありません。これにより、メンバーが issue_id や type をハッキングする利点がないため、適切な保護が提供されます。

于 2012-10-09T05:05:35.033 に答える