ассоциации в рельсах от переднего конца - PullRequest
0 голосов
/ 01 августа 2010

У меня есть модели User и Group. User has_many Groups и Group belongs_to User

У меня уже есть записи в пользовательской таблице:

id    name
--------------
1     testuser
2     someotheruser

Представьте себе, если пользователь с идентификатором 1 (testuser) вошел в систему, и я хочу создать группы внутри этого пользователя.

Когда я создаю новую группу из нового действия в контроллере группы, записи в БД выглядят так:

   id   groupname   user_id
   ------------------------
   1    groupA
   2    groupB

Как видите, user_id, столбец всегда пуст, поэтому связь отсутствует.

Что мне нужно сделать, чтобы создать эту ассоциацию?

код GroupsController:

  def new
    @group = Group.new
  end

  def create
    @group = Group.new(params[:group])
    if @group.save
      flash[:notice] = "Successfully created group."
      redirect_to groups_url
    else
      render :action => 'new'
    end
  end

код для views/groups/new.html.erb

<% title "New Group" %>

<% form_for @group do |f| %>
  <%= f.error_messages %>
  <p>
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </p>
  <p>
    <%= f.label :description %><br />
    <%= f.text_field :description %>
  </p>
  <p><%= f.submit %></p>
<% end %>


<p><%= link_to "Back to List", groups_path %></p>

Я новичок в рельсах, пожалуйста, скажите мне, как установить связь с пользователем. С консоли я могу создать ассоциацию, добавив группы для пользователя, например так:

@u = User.find(1)
@u.groups.create(:groupname=>"groupA")
@u.save

но я не знаю, как это сделать из внешнего интерфейса.

Ответы [ 2 ]

0 голосов
/ 01 августа 2010

Сначала вы должны убедиться, что группа не может быть сохранена без пользователя:

/ приложение / модели / group.rb

class Group
  belongs_to :user
  validates_presence_of :user
end

Затем по умолчанию группа будет текущим пользователем.

/ приложение / контроллеры / groups_controller.rb

def create
  @group = Group.new(params[:group])
  @group.user = current.user
  if @group.save
    ...
  else
    ...
  end
end

Вы также можете сделать @group.user = current_user if @group.user.nil?, но похоже, что единственным пользователем, который создаст группу, будет текущий пользователь.

0 голосов
/ 01 августа 2010

Вы должны убедиться, что ваш идентификатор пользователя является частью параметров, переданных в Group.new, возможно, что-то вроде этого:

def create
  @group = Group.new(params[:group].merge!({:user_id => current_user}))
  if @group.save
    flash[:notice] = "Successfully created group."
    redirect_to groups_url
  else
    render :action => 'new'
  end
end

Возможно, вы захотите добавить флэш [: error] в другоеа также в противном случае пользователю будет сложно запутаться в новом действии без объяснения причин.

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