【问题标题】:NameError - undefined local variable or method when calling created method in controllerNameError - 在控制器中调用创建的方法时未定义的局部变量或方法
【发布时间】:2011-05-02 03:03:33
【问题描述】:

尝试访问原因索引页面时

NameError in Reasons#index

Showing /home/alec/workspace/rails/nwis/app/views/reasons/index.html.erb where line #26 raised:

undefined local variable or method `upvote_reason' for #<#<Class:0x000000023d9940>:0x000000023d3298>
Extracted source (around line #26):

23:     <td><%= link_to 'Show', reason %></td>
24:     <td><%= link_to 'Edit', edit_reason_path(reason) %></td>
25:     <td><%= link_to 'Destroy', reason, :confirm => 'Are you sure?', :method => :delete %></td>
26: <td><%= link_to "Vote up", :action => upvote_reason, :id => reason.id %></td>
27:   </tr>
28: <% end %>
29: </table>
Rails.root: /home/alec/workspace/rails/nwis

Application Trace | Framework Trace | Full Trace
app/views/reasons/index.html.erb:26:in `block in _app_views_reasons_index_html_erb__2084449067598068298_18776480__4598497200926455905'
app/views/reasons/index.html.erb:16:in `each'
app/views/reasons/index.html.erb:16:in `_app_views_reasons_index_html_erb__2084449067598068298_18776480__4598497200926455905'
app/controllers/reasons_controller.rb:7:in `index'

视图中的行:

<td><%= link_to "Vote up", :action => upvote_reason, :id => reason.id %></td>

控制器中的方法:

def upvote_reason
    @reason = Reason.find(params[:id])
    @reason.upvote += 1
    @reason.save
    redirect_to reason_path
end

诚然,我对 Rails 还很陌生,但一旦我弄清楚如何正确地与控制器交互,我就觉得自己快要点击它了。如果有人可以为我指出正确的方向来很好地涵盖该主题的教程,如果这太基本的问题,我很乐意检查它。

【问题讨论】:

    标签: ruby-on-rails model-view-controller methods nameerror


    【解决方案1】:

    在它前面加一个冒号将它变成一个符号,或者在它周围加上引号:

    :action => :upvote_reason
    

    :action => "upvote_reason"
    

    此外,您还需要更新路线。而你目前可能只有resources :reasons,你会想要这样的东西:

    resources :reasons do
      get "upvote_reason", :on => :member
    end
    

    其实添加这条路由后,你可以直接使用命名路由来代替你的:action:id参数:

    <%= link_to "Vote up", upvote_reason_reason_path(reason) %>
    

    (如果您只是将 upvote_reason 操作重命名为 upvote,那么这将变为 upvote_reason_path(reason)

    【讨论】:

    • 谢谢!但是,这导致了路由错误:No route matches {:action=&gt;"upvote_reason", :id=&gt;1, :controller=&gt;"reasons"} - 我认为使用 link_to 会自动生成指向适当控制器方法的链接并给定 id 参数?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    相关资源
    最近更新 更多