2010-08-01 4 views
0

У меня есть модель User и Group. Userhas_manyGroups и Groupbelongs_toUserассоциации в рельсах с переднего конца

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

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 

, но я не знаю, как получить это сделано от переднего конца.

ответ

0

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

/app/models/group.rb

class Group 
    belongs_to :user 
    validates_presence_of :user 
end 

Затем, позволяет по умолчанию чтобы быть текущим пользователем.

/app/controllers/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

спасибо, я попробую это. Я собирался попытаться пропустить скрытое поле с user_id, но это намного лучше – Patrick

0

Вы должны убедиться, что ваш идентификатор пользователя является частью Params переданных 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 

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

Смежные вопросы