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,如何将两者链接在一起以便只有发布的原始人才能查看编辑链接??请帮帮我
答案 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”。