请帮助解决问题。
表格帖子
var DropdownButton = ReactBootstrap.DropdownButton;
var MenuItem = ReactBootstrap.MenuItem;
var Hello = React.createClass ({
getInitialState() {
return { key: null }
},
onSelect(key) {
this.setState({ key: key });
},
render() {
var selected = this.state.key ? <p>Selected: {this.state.key}</p> : '';
return (<div>
<DropdownButton bsStyle="primary" title="Test" onSelect={this.onSelect}>
<MenuItem eventKey='1' active={this.state.key==='1'}>Action</MenuItem>
<MenuItem eventKey='2' active={this.state.key==='2'}>Another action</MenuItem>
<MenuItem eventKey='3' active={this.state.key==='3'}>Active Item</MenuItem>
<MenuItem divider />
<MenuItem eventKey='4' active={this.state.key==='4'}>Separated link</MenuItem>
</DropdownButton>
{selected}
</div>);
}
});
React.render(<Hello/>, document.getElementById('container'));
表格标签
create_table "posts", force: :cascade do |t|
t.string "title"
t.text "body"
end
加入表
create_table "tags", force: :cascade do |t|
t.string "tagname"
end
模特邮报
create_table "posts_tags", id: false, force: :cascade do |t|
t.integer "post_id"
t.integer "tag_id"
end
模型标签
class Post < ActiveRecord::Base
has_and_belongs_to_many :tags
end
我需要删除一些关联表posts_tags。
我从表单集ID标签中获取:
class Tag < ActiveRecord::Base
has_and_belongs_to_many :posts
end
这是我的控制器处理此set id_tags:
[3, 18, 21]
因此,我收到以下错误消息:
def update
if @post.update_attributes(post_params)
#add_new_tags(@post)
p '------------------1'
p params['delete_tags']
p '------------------2'
destroy_tags(params['delete_tags'], @post)
flash[:success] = t :post_updated
redirect_to user_post_path(@user, @post)
else
flash[:error] = t :post_not_updated
render 'edit'
end
end
private
def destroy_tags(tags,post)
tags.each do |tag|
p '=================='
p tag
tag_del = post.tags.find_by_post_id(:post_id => post.id)
if teg_del
post.tags.delete(tag_del)
end
end
end
def post_params
params.require(:post).permit(:delete_tags)
end
控制台显示以下消息:
undefined method `find_by_post' for #<Tag::ActiveRecord_Associations_CollectionProxy:0x007f097ed78ac8>
答案 0 :(得分:0)
由于你有一个连接表,标签表本身没有post_id,所以find_by不起作用。但这并不是必需的,因为post.tags无论如何都会检索连接到该帖子的所有标签。
使用诸如collection_check_boxes之类的东西,你可以获得很多处理habtm关系和表格的功能,我不认为你需要额外的销毁标签方法,除非我误解了你的内容正在努力完成。您可以考虑在帖子中添加/删除标记关联,如下所示:
发布 - has_and_belongs_to_many:标签
标签 - has_and_belongs_to_many:帖子
发布更新表格:
<legend>Tags</legend>
<div class="form-group">
<%= f.collection_check_boxes(:tag_ids, Tag.all, :id, :name) %>
</div>
确保允许:tag_ids =&gt; []在你的控制器的post_params
中将允许您通过添加已检查的任何新标签并删除表单中未选中的任何标签来更新属于帖子的标签,并且您可以正常创建和更新控制器操作,而无需额外的destroy_tags方法