【问题标题】:Rendering an Edit partial while selected a defaulted value在选择默认值时渲染编辑部分
【发布时间】:2010-09-17 16:53:00
【问题描述】:

我的 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 %>

但由于某种原因,vote 变量不包含任何东西,除了 article_id,也没有 value 方法,任何想法?

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}}}

【问题讨论】:

    标签: ruby-on-rails ruby views voting


    【解决方案1】:

    其背后的原因是命名作用域实际上返回命名作用域,并且您不能像访问投票类一样访问属性。我通过更改检索投票的方式并忘记使用该命名范围来解决此问题。我通过使用:

     <% @vote = current_user.votes.find_by_article_id(@article)%>
    

    这是一个 Rails 方法,实际上返回一个投票类。然后我把它传给了局部,魔法就奏效了!

    非常感谢 thenduks,没有他的帮助,我无法做到。

    【讨论】:

      【解决方案2】:

      所以首先要修复的是这一行:

      <%= @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 =&gt; {...} 会生成实例变量,所以您希望 @vote 在表单的部分中。

      【讨论】:

      • 抱歉,这确实是 ERB 输出中的一种类型。
      • 我已经发了一段时间了,有cmet吗?
      • 当你更新问题时我没有收到通知,只有当你评论我的答案时才收到通知:)... 很奇怪。尝试两件事,找出命名范围是否是问题,将问题中的第一位代码更改为@vote = Vote.first。如果@vote.value 仍然一无所有,请查看询问它的类,以确保它实际上是Vote&lt;%= @vote.class.name %&gt;
      • 另外,当你说你尝试@vote.value 并且它“告诉你”没有.value 时,你到底是什么意思?例外?如果您不介意,也可以粘贴实际的异常。
      • 嗯,嗯,在我看来,这实际上可能是某种命名约定问题。暂时忘记命名范围,试试这个:Vote.find_by_user_and_article( current_user, @article )
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      • 2014-08-08
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      • 2016-01-28
      相关资源
      最近更新 更多