如何在可查看原始海报上进行编辑,在我的应用程序RoR中将帖子称为“汽车”

时间:2011-05-18 13:01:35

标签: ruby-on-rails ruby

undefined local variable or method `current_user' for #<ActionView::Base:0x4cdbb48>
Extracted source (around line #7):

4:     <dd>
5:     <%= car.name %><br />
6:     <%= car.description %><br />
7:     <%= link_to('edit', edit_post_path(@car)) if current_user.cars.include?(@car) %>
8:     <%= link_to "Delete", 
9:     :controller => :car, 
10:    :action => :delete,

我正在使用session [:user_id] = @ user.id来跟踪当前用户登录和car.id作为帖子ID,如何将两者链接在一起以便只有发布的原始人才能查看编辑链接??请帮帮我

2 个答案:

答案 0 :(得分:0)

个人,为了解决类似问题,我使用了设计宝石。

然后我确保在用户和汽车表之间有某种关联(使用你的例子),然后进行简单的erb检查以确定它们是否匹配。如果不是,请使用只读视图,否则允许可编辑视图。 erb检查看起来像这样。

<% if current_user.id = car.owner.id %>
  ...show the editable view... 
<% else %>
  ...show the read only view...
<% end %>

如果您根本不希望他们看到视图,如果他们没有“拥有”它,您可以使用控制器中的before_filter来检查用户与汽车的关系,然后根据用户做“正确的事情”您所需的应用要求。您可以转发到未经授权的操作视图,或者只是将它们重定向到安全的地方。

此外,您可以简单地隐藏导致视图的链接或按钮,但无论我在控制器中保护了什么。

我希望这有点帮助...

编辑:我应该说使用devise gem为我提供了开箱即用的“用户”支持,然后您可以相对轻松地根据您的特定业务需求进行定制。

答案 1 :(得分:0)

您说您已在@user中拥有登录用户,因此您可以这样做:

<%= link_to('edit', edit_post_path(@car)) if @car.user_id == @user.id %>

我建议使用ActiveRecord的关联 - 它们会在这个和其他场景中派上用场。

应用程序/模型/ user.rb

Class User < ActiveRecord::Base
  has_many :posts
  ...
end

应用程序/模型/ post.rb

Class Post < ActiveRecord::Base
  belongs_to :user
  ...
end

然后在您的视图模板中,您可以执行以下操作:

<%= link_to('edit', edit_post_path(@car)) if @user.posts.include?(@car) %>

为清楚起见,我强烈建议尽可能使用变量名称的型号名称,例如:对于Post模型的实例,@post而不是“@car”。