我在获取在博客中编辑文章的用户时遇到困难。我能够让用户创建这样的文章: - <%= @article.user.username if @article.user %>
。我已经实现了编辑文章的功能,但不知道如何让用户编辑文章。
articles_controller.rb
class ArticlesController < ApplicationController
before_filter :is_user_admin, only: [:new, :create, :edit, :destroy]
before_filter :log_impression, :only=> [:show]
def is_user_admin
redirect_to(action: :index) unless current_user.try(:is_admin?)
return false
end
def log_impression
@article = Article.find(params[:id])
# this assumes you have a current_user method in your authentication system
@article.impressions.create(ip_address: request.remote_ip,user_id:current_user.id)
end
def index
@articles = Article.all(:order => "created_at DESC")
@article_titles = Article.first(10)
@tags = Tag.all
end
def show
@article = Article.find(params[:id])
@related_articles = Article.joins(:taggings).where('articles.id != ?', @article.id).where(taggings: { tag_id: @article.tag_ids })
@article_popular = Article.order('articles.impressions_count DESC').limit(5)
end
def new
@article = Article.new
end
def create
@article = Article.new(params[:article])
@article.user_id = current_user.id
if @article.save
flash[:success] = "article created!"
redirect_to article_path(@article)
else
render 'new'
end
end
def destroy
@article = Article.find(params[:id])
@article.destroy
redirect_to action: 'index'
end
def edit
@article = Article.find(params[:id])
end
def update
@article = Article.find(params[:id])
if @article.update_attributes(params[:article])
flash.notice = "Article '#{@article.title}' Updated!"
redirect_to article_path(@article)
else
render 'edit'
end
end
end
物品/ show.html.erb
<div class="row-fluid">
<div class="span12">
<div class ="span9">
<div class ="row-fluid">
<div id="upperborder">
<div id="lowerborder">
<div style="color:#1fb2e8;font-size:2.3em;"><%= @article.title %></div>
<div id="tabs">
<ul id="tabs">
<li> <%= time_tag(@article.created_at.in_time_zone("Asia/Calcutta")) %> </li>
<li> <%= @article.user.username if @article.user %></li>
<li>
<% unless @article.comments.empty? %>
(<%= @article.comments.size %>) comments
<% end %>
</li>
<li>
<% @article.tags.each do |tag| %>
<%= link_to tag.name, tag_path(tag) %>
<% end %>
</li>
</ul>
</div>
<hr id="upperline">
<div style="font-size: 1.2em"><%= @article.body %></div>
<div id="tabs">
<ul id="tabs">
<div style="margin-top:20px; margin-left:10px"> <li> <%= link_to "back",articles_path, :class => '' %></li></div>
<% if current_user.try (:is_admin) %>
<div style="margin-top:20px;margin-left:-10px""> <li> <%= link_to "edit", edit_article_path(@article), :class => '' %></li> </div>
<div style="margin-top:20px"> <li> <%= link_to "delete",article_path(@article),:method => :delete,:confirm => 'Are you sure?',:class => '' %></li> </div>
<% end %>
</ul>
</div>
<div id="fabs">
<ul id="fabula">
<div style="margin-left:250px; font-size:1.2em;color:#1fb2e8;margin-top:-0px"> Viewed: <%=@article.impression_count %> times,
<% if (@article.created_at != @article.updated_at) %>
edit: <%= time_ago_in_words(@article.updated_at) %> ago,
<% end %>
<% if ! @article.comments.empty? %>
Active: <%= time_ago_in_words(@article.comments.last.created_at) %> ago
<% end %>
</div>
</ul>
</div>
<hr style="border: 1px solid #E0E0F0; margin-top:50px">
<div id="commentform">
<%= render :partial => 'comments/comment_form' %>
<% @article.comments.each do |c| %>
<% if !c.nil? %>
<div id ="commentdisplay"> <%= render partial: 'comments/comment', :locals => { :comment => c } %> </div>
<% end %>
<% end %>
</div>
</div>
</div>
</div>
<div class="span3">
<div id="popular">
<% if !@article_popular.empty? %>
<div id="headerpopular"> most viewed articles </div>
<% @article_popular.each do |article_popular| %>
<div id="popular-title"> <%= link_to truncate(article_popular.title, :length => 35, :separator => ' '), article_path(article_popular) %></div>
<% end %>
<% end %>
</div>
</div>
</div>
<% if !@related_articles.empty? %>
<div id = "related-border">
<div id="related-title"> Related articles </div>
<% @related_articles.each do | related_article | %>
<div id="related-title-link"> <%= link_to truncate(related_article.title, :length => 35, :separator => ' '), article_path(related_article) %></div>
<% end %>
</div>
<% else %>
<div id="related-border">
<div id="ygm"> You got us ! </div>
<div id="nofound"><h3> no related article found :(</h3></div>
</div>
<% end %>
schema.rb
ActiveRecord :: Schema.define(:version =&gt; 20130421123420)做
create_table "articles", :force => true do |t|
t.string "title"
t.text "body"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
t.integer "user_id"
t.integer "impressions_count"
end
create_table "comments", :force => true do |t|
t.text "content"
t.integer "user_id"
t.string "article_id"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
create_table "impressions", :force => true do |t|
t.string "impressionable_type"
t.integer "impressionable_id"
t.integer "user_id"
t.string "ip_address"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
create_table "taggings", :force => true do |t|
t.integer "tag_id"
t.integer "article_id"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
add_index "taggings", ["article_id"], :name => "index_taggings_on_article_id"
add_index "taggings", ["tag_id"], :name => "index_taggings_on_tag_id"
create_table "tags", :force => true do |t|
t.string "name"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
create_table "users", :force => true do |t|
t.string "email", :default => "", :null => false
t.string "encrypted_password", :default => "", :null => false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", :default => 0
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.boolean "is_admin"
t.boolean "is_active"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
t.string "username"
end
article.rb
class Article < ActiveRecord::Base
attr_accessible :title, :body
attr_accessible :tag_list
has_many :comments
belongs_to :user
has_many :taggings, :dependent => :destroy
has_many :tags, through: :taggings , :dependent => :destroy
has_many :impressions, as: :impressionable
validates :title, :body, :tag_list, :presence => true
def impression_count
impressions.size
end
def unique_impression_count
impressions.group(:ip_address).size #UNTESTED: might not be correct syntax
end
def tag_list
self.tags.collect do |tag|
tag.name
end.join(", ")
end
def tag_list=(tags_string)
tag_names = tags_string.split(",").collect{|s| s.strip.downcase}.uniq
new_or_found_tags = tag_names.collect { |name| Tag.find_or_create_by_name(name) }
self.tags = new_or_found_tags
end
end
user.rb
class User < ActiveRecord::Base
has_many :articles, :order => "created_at DESC"
has_many :comments
# Include default devise modules. Others available are:
# :token_authenticatable, :confirmable,
# :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
# Setup accessible (or protected) attributes for your model
attr_accessible :username, :email, :password, :password_confirmation, :remember_me
attr_accessible :title, :body
end
我需要获得编辑文章的用户。如果您需要更多代码粘贴在这里,请告诉我。感谢。
答案 0 :(得分:2)
你在使用装饰吗?如果是,您应该从任何控制器获取current_user表单。在篇文章中,编辑抓取current_user并将其存储在DB中。
如果您没有使用设计,请在您的应用程序控制器中创建current_user方法,并在用户登录时对其进行初始化。在文章#edit中使用它。
答案 1 :(得分:0)
在控制器的操作中使用current_user
方法来获取正在编辑的用户。