Отображение ссылки в микросообщениях и комментариев, ссылающихся на профиль автора? - PullRequest
1 голос
/ 30 января 2012

Я создал модель Micropost, которая имеет следующие атрибуты:

<Micropost id: 1, content: "test", user_id: 1, created_at: "2012-01-25 15:34:30", updated_at: "2012-01-29 11:07:53", title: "asdasdad">

Модель пользователя со следующими атрибутами:

<User id: 1, email: "alex@gmail.com", username: nil, etc...>

и модель комментария со следующими атрибутами:

<Comment id: 1, content: "sdf", micropost_id: 1, user_id: nil, created_at: "2012-01-29 11:10:42", updated_at: "2012-01-29 11:10:42">

Пока что я только выполнил это:

  • Отображение имени пользователя автора микросообщения
  • Показать ID авторов комментариев микросообщений

    <h2>Micropost Index</h2>
    <% @microposts.each do |micropost| %>
    
    <%= micropost.title %></td>
    <%= micropost.content %></td>
    <%= link_to 'Show', micropost %></td>
    <%= link_to 'Edit', edit_micropost_path(micropost) %></td>
    <%= link_to 'Destroy', micropost, confirm: 'Are you sure?', method: :delete %>     
    
    <h2>Comments</h2>
    
    <% @micropost.comments.each do |comment| %>
      <p>
        <b>Comment:</b>
        <%= comment.content %>
      </p>
      <p>
        <b>Commenter</b>
        <%= comment.user_id %>
      </p>
    <% end %>
    
  • Я не знаю, как создать ссылку на профиль автора (например, mysite.com/users/1).

  • Не знаю, как найти имя автора комментария и ссылку на его / ее профиль

EDIT:

Модель:

user.rb:

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :omniauthable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me, :username

  has_many :microposts
  has_many :comments

  def self.find_for_facebook_oauth(access_token, signed_in_resource=nil)
    data = access_token.extra.raw_info
    if user = User.where(:email => data.email).first
      user
    else # Create a user with a stub password. 
      User.create!(:email => data.email, :password => Devise.friendly_token[0,20]) 
    end
  end
end

micropost.rb:

class Micropost < ActiveRecord::Base
  attr_accessible :title, :content

  belongs_to :user
  has_many :comments
end

comment.rb:

class Comment < ActiveRecord::Base
  attr_accessible :content, :user_id

  belongs_to :micropost
  belongs_to :user
end

Контроллер микросообщений:

Контроллеры / microposts.rb

  def show
    @micropost = Micropost.find(params[:id])
  end

  def new
    @micropost = Micropost.new
  end

  def create
    @user = current_user
    @micropost = @user.microposts.new(params[:micropost])
    @micropost.save
    redirect_to @micropost
  end

Есть предложения для этого?

Ответы [ 2 ]

2 голосов
/ 30 января 2012

Чтобы сделать ссылку на пользователя, вы можете использовать

<%= link_to comment.user.username, comment.user %>

В общем, часть "Магии Рельсов" заключается в том, что если вы правильно настроили ассоциацию, вы можете получить доступ к связанным объектам через точечную запись. Это означает, что вам не нужно говорить comment.user_id, а вместо этого перейти непосредственно к связанному объекту пользователя, например, comment.user.username или comment.user.email ... вы поняли:)

Для этого вы должны настроить свои модели так:

class User < ActiveRecord::Base
  validates_presence_of :username #username should obviously not allow nil values
  has_many :microposts
  has_many :comments
end

class MicroPost < ActiveRecord::Base
  belongs_to :user
end

class Comment < ActiveRecord::Base
  belongs_to :user
end
1 голос
/ 30 января 2012
# Link:
=link_to "User profile", user_path(comment.user)

# Name of the author
=comment.user.username

или поскольку у вас есть user_id в Micropost и Comment

# Link:
=link_to "User profile", (@micropost.user)

# Name of the author
=@micropost.user.username
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...