Rails 3 & Devise: отслеживание профиля who-owns для сообщений пользователей - PullRequest
0 голосов
/ 01 марта 2011

В моем приложении есть модель пользователя и модель поста, в которой пользователь has_many посты и посты принадлежат пользователям.Сообщения отображаются на странице профиля пользователя.Я бы хотел, чтобы любой пользователь мог публиковать сообщения самостоятельно или на странице профиля любого другого пользователя.Однако у меня проблема в том, что, хотя я знаю, кто публикует сообщение (current_user), я не знаю, чей профиль current_user включен.Мне нужно знать это, чтобы назначить новый пост постам этого пользователя.Как извлечь информацию об идентификаторе пользователя из просматриваемого в данный момент профиля, чтобы я знал, где назначить новое сообщение?

Мой контроллер микросообщений выглядит следующим образом:

class MicropostsController < ApplicationController
  before_filter :authenticate_user!

  def create
   @user_of_page = User.find_by_name(params[:id]) 
   @micropost = @user_of_page.microposts.build(params[:micropost])
    if @micropost.save
      flash[:success] = "Micropost created!"
      redirect_to :back
    else
      redirect_to about_path
    end
  end

  def destroy
  end
end

Но я получаюNoMethodError: неопределенный метод `microposts 'для nil: NilClass.Я предполагаю, что это потому, что я делаю некоторую ошибку с созданием переменной user_of_page, но я не знаю, что это такое!

РЕШЕНИЕ

Спасибо Сэм,Я воспользовался вашим советом и закончил тем, что сделал это так:

  1. Я добавил столбец в свою таблицу Micropost, названный ow_to_id.

  2. Затем я передал идентификатор пользователя, профиль которого отображается из представления пользователя, в контроллер микросообщений, используя скрытое поле в форме микросообщений, например:

       <%= form_for @micropost do |f| %>
       <%= render 'shared/error_messages', :object => f.object %>
    
       <div class="field">
          <%= f.label :content, "Why that mood?" %>
          <%= f.text_area :content %>
       </div>
    
       <div class="field">
          <%= f.hidden_field :author, :value => current_user.name %>
          <%= f.hidden_field :belongs_to_id, :value => @user.id %>
      <%= f.hidden_field :agree, :value => "0" %>
      <%= f.hidden_field :disagree, :value => "0" %>
      <%= f.hidden_field :amused, :value => "0" %>
       </div>
    
       <div class="actions">
          <%= f.submit "Submit" %>
       </div>
     <% end %>
    
  3. Затем я использовал это значение идентификатора, чтобы найти пользователя для назначения сообщения в контроллере микросообщений, например:

    class MicropostsController < ApplicationController
      before_filter :authenticate_user!
    
      def create
       @user_of_page = User.find(params[:micropost][:belongs_to_id]) 
       @micropost = @user_of_page.microposts.build(params[:micropost])
        if @micropost.save
          flash[:success] = "Micropost created!"
          redirect_to :back
        else
           redirect_to about_path
        end
      end
    
      def destroy
      end
    end
    

Магия!Еще раз спасибо, вы помогли мне увидеть это правильно.

1 Ответ

1 голос
/ 01 марта 2011

Я бы сделал это так:

class profiles_controller < AC
  ...
  def show
    @profile = User.find(params[:id]).profile || current_user.profile
    @post = Post.new       
  end
  ..
end

/profiles/show.html.erb
... 
Name: <%= @profile.full_name %> 
...
<%= form_for @post do |f| %>
  <%= hidden_field_tag @profile.user %>
  ...
<% end %>

class microposts_controller < AC
  def create
    profile_user = User.find(params[:user_id]) # Owner of the profile current_user is on
    ..
  end
end

Не проверено.Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...