2012-10-09 59 views
0

成員創建的投票既屬於他們又屬於另一個模型,問題。目前我正在做一個隱藏的窗體並傳遞適當的參數。這裏有一個問題索引視圖代碼:有沒有辦法做到這一點在Rails沒有大規模任務?

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

如果你還顯示你的控制器代碼,它會更容易回答。像timpone在下面說的那樣:通過這樣的'session [:member_id]'是無稽之談。只需在控制器中使用'current_user'即可。不涉及你的問題,但'issue.upvotes_count(issue.id)'很奇怪。如果你已經有一個實例,爲什麼要將'id'傳遞給一個實例方法? – Mischa

+0

感謝您指出(計數功能)。我重構了代碼。 – Dan

回答

1

使用範圍:

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

和不通過member_id和ISSUE_ID到隱藏字段。

如果你有適當的嵌套REST風格的路線,你應該能夠得到PARAMS:直接[ISSUE_ID。

1

如果issuemember_id可用之前您vote.save!控制器,你可以手動設置它們在那裏。

1

通常你在控制器中得到current_usermember_id值,而不是通過表單參數傳遞給它。你現在如何擁有它會讓你接受大規模的任務。

0

會員必須先登錄才能參與投票嗎?如果是這樣,那麼您不需要將member_id作爲隱藏字段,因爲您可以在控制器中獲取current_user,這將提供良好的保護,因爲成員無法攻破issue_id或type。在控制器

相關問題