我在我的rails应用程序中有一个部分加载了投票表单(它只是一个数字范围从1-5的选择)。我现在正在制作另一个部分加载,如果用户已经投票它假设是EDIt部分,你选择了你投票的价值,如果你想,你可以改变它。但由于某些原因不起作用,这里是代码。
#Finds the vote by passing the user and the article
<%= @vote = Vote.find_vote_by(current_user,@article) %>
#Renders the partial with the vote variable loaded up with the vote that was found
<%= render :partial => "votes/edit_vote", :locals => {:vote => @vote} %>
这是部分
<% form_for(vote, :url => {:controller => 'votes', :action => 'edit'}) do |f| %>
<%= error_messages_for :vote %>
<p><%= f.hidden_field :article_id %></p>
<p>
<%= f.label :value, "Value for the vote: "%>
<%= f.select :value, {"1" => "1","2" => "2","3" => "3","4" => "4", "5" => "5"}, :selected => vote.value %>
</p>
<p>
<%= f.submit "Cloud-it!" %>
</p>
<% end %>
但由于某种原因,投票变量不包含任何不是article_id,也没有包含值方法的任何想法?
EDIT1:每个请求这里是调试@vote正在输出的内容(它确实是一个合理的值)
attributes:
created_at: 2010-09-02 14:39:04
updated_at: 2010-09-02 14:39:04
id: 1
value: 4
article_id: 1
user_id: 1
attributes_cache: {}
EDIT2
我尝试清除部分代码,以便输出:
<%= debug @vote%>
<%= @vote.value %>
如果我调试@vote它出来完美,将所有属性等。但每当我添加第二行时,它不起作用它告诉我没有.value,我试过.id,.article并没有什么就好像它不存在一样。有什么想法吗?
EDIT3
这是
的投票 named_scope :find_vote_by, lambda {|user,article| {:conditions => {:user_id => user, :article_id => article}}}
答案 0 :(得分:1)
其背后的原因是,命名范围实际上返回命名范围,并且您无法像投票类一样访问属性。我通过改变检索投票的方式并忘记使用该命名范围来修复此问题。我通过使用:
完成了它 <% @vote = current_user.votes.find_by_article_id(@article)%>
这是一个Rails方法,实际上返回一个投票类。然后我把它传递给了局部,而魔法就起作用了!
非常感谢你们,没有他的帮助,我无法做到。
答案 1 :(得分:0)
首先要解决的问题是这一行:
<%= @vote = Vote.find_vote_by(current_user,@article) %>
应该是:
<% @vote = Vote.find_vote_by(current_user,@article) %>
前者用于在ERB中输出,后者用于执行任意ruby码。
接下来,在下面添加一行:
<%= debug @vote %>
并确保它是一个理智的价值。如果没有,请粘贴Vote
类方法find_vote_by
的定义。
编辑:在这种情况下,可能只是因为使用:locals => {...}
会生成实例变量,因此您需要在部分表单中使用@vote
。