Что означает / делает first.user = current_user и почему он работает? - PullRequest
0 голосов
/ 05 июля 2011

Для начала у меня есть 3 модели:

Location has_many :products
User has_many :products
Products belongs_to :user, :location

Теперь у меня есть вложенная форма:

<%= nested_form_for @location do |f| %>
<%= f.error_messages %>
.............
<% f.fields_for :products do |product| %>

Я пытался найти правильный способ, чтобы моя ассоциация current_user моглаработать и вдруг по чистой случайности нашел правильный ответ в этом вопросе, Нулевой внешний ключ во вложенной форме .

Я поместил этот кусок простого кода в свой контроллер, и он, наконец, дал мойпродукты к текущему user_id:

@location.products.first.user = current_user

full -

def create
    @location = Location.new(params[:location])
    @location.products.first.user = current_user
end

Моя конечная цель достигнута.Пользователи имеют свои собственные продукты, созданные в определенном месте.Единственное, чего я не понимаю, это то, почему first.user = current_user работает, а что-то простое, например location = @location.current_user.products.build, - нет.Может ли кто-нибудь дать мне отличное объяснение того, что здесь происходит и что означает первое?Это нормально иметь или это более безопасный / лучший способ?

Спасибо, я ценю это.

Ответы [ 2 ]

1 голос
/ 05 июля 2011

Самый простой способ определить current_user - это

class ApplicationController < ActionController::Base  
  protect_from_forgery  
  helper_method :current_user  

private  
  def current_user  
    @current_user ||= User.find(session[:user_id]) if session[:user_id]  
  end  
end 

так current_user определяется внутри ApplicationController класса всякий раз, когда вы пытаетесь сделать

@location = Location.new(params[:location])
@location.current_user 

вы пытаетесь вызвать метод, определенный в другом классе, как метод Location экземпляра

0 голосов
/ 05 июля 2011

Во время этого оператора

@location.products.first.user = current_user

Rails по умолчанию назначает идентификатор current_user с левой стороны.Это стало возможным благодаря внутреннему вызову to_param .Вы можете даже переопределить этот метод, чтобы он возвращал что-то еще, даже случайные вещи, но это не поможет:)

относительно @location.current_user.products.build, это не будет работать, потому что местоположение и пользователь не связаны, если вы хотитечтобы сделать эту работу, вы можете сделать это путем создания продукта в новом методе и передачи текущего идентификатора пользователя в качестве параметра методу.

def new
  @location = Location.new
  @location.products.build
  respond_to do|format|
    format.html
  end
end

ОБНОВЛЕНИЕ: Я принимаю комментарий Тумту, не рекомендуетсяпоставить идентификатор пользователя как скрытый элемент.

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